我的印象是recvfrom()为你提供了正在侦听的IP和端口上的下一个数据包,如果不是,那么侦听数据包就会丢失。我们遇到的问题可能是数据包排队等待recvfrom(),因此即使recvfrom()没有主动监听,它也会监听并捕获所有数据包。
我找不到关于此的明确文件。有人确切知道recvfrom()的特性是在没有被调用时不对数据包进行排队吗?
代码示例:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mcast_g = socket.inet_aton(group)
mreq = struct.pack('4sL', mcast_g, socket.INADDR_ANY)
s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
s.bind(('', port))
while True:
data, sender = s.recvfrom(1500)
# Do stuff
# Are packets being queued up here?
答案 0 :(得分:4)
内核中有一个套接字接收缓冲区。 recv()
和朋友从缓冲区中读取,或者在空闲时阻塞。如果读取速度不够快,则缓冲区填充,缓冲区已满时到达的UDP数据报将被删除。您可以使用套接字选项SO_RCVBUFSIZE.
答案 1 :(得分:0)
它确实取决于操作系统的实现,但大多数现代操作系统都存在大量的缓冲。