我相信非阻塞UDP套接字会在sendto上引发BlockingIOError。我想强迫这种情况来测试我的程序在这种情况下的行为。
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
。
我的信念是错误的:可以从不引发BlockingIOError吗?或者如果可以的话,我该如何强制呢?
我的目标是进行集成样式的测试:我实际上想拥有一个真实的套接字并进行实际的网络调用。在这种情况下,模拟插座以进行单元样式的测试是不理想的。
该套接字只能在单线程Python asyncio程序中使用。
从C中的TCP / IP套接字:程序员实用指南,Michael J. Donahoo,Kenneth L. Calvert
对于UDP套接字,没有发送缓冲区,因此
send()
和sendto()
从不返回EWOULDBLOCK
[https://linux.die.net/man/2/sendto中有一个提示,说明为什么...
当设备队列溢出时,数据包只是被静默丢弃。
所以用Python来讲,至少在Linux上无法提高BlockingIOError
。