强制使用非阻塞UDP套接字在sendto上引发BlockingIOError

问题描述 投票:0回答:1

我相信非阻塞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程序中使用。

python linux sockets udp nonblocking
1个回答
-1
投票

从C中的TCP / IP套接字:程序员实用指南,Michael J. Donahoo,Kenneth L. Calvert

对于UDP套接字,没有发送缓冲区,因此send()sendto()从不返回EWOULDBLOCK

[https://linux.die.net/man/2/sendto中有一个提示,说明为什么...

当设备队列溢出时,数据包只是被静默丢弃。

所以用Python来讲,至少在Linux上无法提高BlockingIOError

© www.soinside.com 2019 - 2024. All rights reserved.