4

我的印象是 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?
4

2 回答 2

4

内核中有一个套接字接收缓冲区。recv()和朋友从缓冲区中读取,或在缓冲区为空时阻塞。如果读取速度不够快,则缓冲区会填满,当缓冲区已满时到达的 UDP 数据报将被丢弃。您可以使用套接字选项改变缓冲区的大小SO_RCVBUFSIZE.

于 2013-06-25T20:27:57.363 回答
0

它确实取决于操作系统的实现,但在大多数现代操作系统上都存在大量缓冲。

于 2013-06-25T17:58:18.800 回答