python的recvfrom()队列包吗?

时间:2013-06-25 17:55:06

标签: python sockets networking listener recv

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

2 个答案:

答案 0 :(得分:4)

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

来改变缓冲区的大小

答案 1 :(得分:0)

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