Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python';s recvfrom()队列数据包?_Python_Sockets_Networking_Listener_Recv - Fatal编程技术网

python';s 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

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

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

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

因此,您所说的是操作系统的IP堆栈队列消息完全独立于recvfrom()的操作。如果操作系统正在对消息进行排队,则recvfrom()不在乎。它只是从堆栈中获取下一条消息。
recvfrom()
是操作系统的一部分。像这样试图把他们说成两个不合作的实体是没有意义的。如果操作系统有一个缓冲区(基本上所有操作系统都有),那么这个缓冲区就是
recvfrom()
从中获取数据的地方。我看不出Steve在哪里说过这样的话。我要提醒你不要养成“你这么说”的习惯。结果总是错误的。