python';s recvfrom()队列数据包?
我的印象是recvfrom()给了您IP上的下一个数据包和它正在侦听的端口,如果它没有侦听,数据包就会丢失。我们遇到了一个问题,问题可能是数据包排队等待recvfrom(),因此它正在侦听和捕获所有数据包,即使recvfrom()没有主动侦听 我找不到这方面的确切文件。有人知道recvfrom()的特性是在不被调用时不排队吗 代码示例:python';s recvfrom()队列数据包?,python,sockets,networking,listener,recv,Python,Sockets,Networking,Listener,Recv,我的印象是recvfrom()给了您IP上的下一个数据包和它正在侦听的端口,如果它没有侦听,数据包就会丢失。我们遇到了一个问题,问题可能是数据包排队等待recvfrom(),因此它正在侦听和捕获所有数据包,即使recvfrom()没有主动侦听 我找不到这方面的确切文件。有人知道recvfrom()的特性是在不被调用时不排队吗 代码示例: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOC
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?
它确实取决于操作系统的实现,但在大多数现代操作系统上存在大量的缓冲。内核中有一个套接字接收缓冲区
recv()
和friends从缓冲区读取,或在缓冲区为空时阻塞。如果读取速度不够快,缓冲区将被填满,缓冲区满时到达的UDP数据报将被丢弃。您可以使用套接字选项改变缓冲区的大小。因此,您所说的是操作系统的IP堆栈队列消息完全独立于recvfrom()的操作。如果操作系统正在对消息进行排队,则recvfrom()不在乎。它只是从堆栈中获取下一条消息。recvfrom()
是操作系统的一部分。像这样试图把他们说成两个不合作的实体是没有意义的。如果操作系统有一个缓冲区(基本上所有操作系统都有),那么这个缓冲区就是recvfrom()
从中获取数据的地方。我看不出Steve在哪里说过这样的话。我要提醒你不要养成“你这么说”的习惯。结果总是错误的。