Я считаю, что неблокирующий сокет 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.