Заставить неблокирующий сокет UDP вызвать BlockingIOError на sendto - PullRequest
0 голосов
/ 17 января 2020

Я считаю, что неблокирующий сокет UDP может вызвать ошибку BlockingIOError на sendto. Я хотел бы заставить эту ситуацию проверить, как моя программа ведет себя в этом случае.

sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
sock.setblocking(False)
sock.bind(('', 7777))
...
# Even if repeating in a loop, doesn't seem to raise a BlockingIOError
sock.sendto(b'abcde', ('1.2.3.4', 61908))

Я попытался установить малый исходящий буфер на

buffer_size = 5
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, buffer_size)

Но, похоже, он не оказывает никакого влияния или приводит к OSError: [Errno 40] Message too long, если буфер меньше данных .

Не верна ли моя вера: может ли никогда вызвать ошибку BlockingIOEror? Или, если это возможно, как я могу форсировать это?

Моя цель здесь - провести тест в стиле интеграции: я хочу на самом деле иметь настоящий сокет и делать реальные сетевые вызовы. В этом случае не рекомендуется подделывать сокет для модульного теста.

Сокет будет использоваться только из однопоточной программы Python asyncio.

1 Ответ

0 голосов
/ 18 января 2020

Из сокетов TCP / IP в C: Практическое руководство для программистов, Майкл Дж. Донаху, Кеннет Л. Калверт

Для сокетов UDP нет буферов отправки, поэтому send() и sendto() никогда не вернется EWOULDBLOCK

А из https://linux.die.net/man/2/sendto есть подсказка, почему ...

Пакеты просто молча отбрасывается при переполнении очереди устройства.

Таким образом, с точки зрения Python, значение BlockingIOError не может быть повышено, по крайней мере, на Linux.

...