在 Python 中使用套接字 recvfrom 接收多播数据
Receiving multicast data with socket recvfrom in Python
我有一个多播服务器发送必须由 python 客户端捕获的数据。问题是 recvfrom 没有接收到任何数据,或者至少接收到第一个数据包并对其进行了缓存。如果我在循环中使用 recvfrom,那么我的数据就会被正确接收。
我的问题是为什么我应该在循环中使用 recvfrom 来获得预期的行为?
from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.bind(('172.30.102.141',12345))
m=s.recvfrom(1024)
print m[0]
# sleep for x seconds here
m=s.recvfrom(1024)
print m[0]
# print the exact same thing as previously...
有一件事是肯定的,多播基本上就是发送 UDP 数据包,你必须不断地监听新的数据包。即使对于基于 TCP 协议的通信也是如此。
当您使用低级接口进行网络通信时,就像 socket
一样,双方都需要定义应用程序级协议。
这意味着,您定义接收方如何得出消息已完成的结论。这是因为消息可能会分裂成多个 parts/packets 通过网络。所以接收方必须以适当的方式 assemble 它们,然后检查消息是否完整。之后,您通过处理消息的管道或您在接收方所做的任何事情将其向上推送。
当使用 UDP 时,接收方不知道是否有任何数据包在途中,所以它只是尝试 recvfrom
1024 字节并完成。它不知道也不应该关心是否有更多数据在传输途中。这由你来处理。
我有一个多播服务器发送必须由 python 客户端捕获的数据。问题是 recvfrom 没有接收到任何数据,或者至少接收到第一个数据包并对其进行了缓存。如果我在循环中使用 recvfrom,那么我的数据就会被正确接收。
我的问题是为什么我应该在循环中使用 recvfrom 来获得预期的行为?
from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.bind(('172.30.102.141',12345))
m=s.recvfrom(1024)
print m[0]
# sleep for x seconds here
m=s.recvfrom(1024)
print m[0]
# print the exact same thing as previously...
有一件事是肯定的,多播基本上就是发送 UDP 数据包,你必须不断地监听新的数据包。即使对于基于 TCP 协议的通信也是如此。
当您使用低级接口进行网络通信时,就像 socket
一样,双方都需要定义应用程序级协议。
这意味着,您定义接收方如何得出消息已完成的结论。这是因为消息可能会分裂成多个 parts/packets 通过网络。所以接收方必须以适当的方式 assemble 它们,然后检查消息是否完整。之后,您通过处理消息的管道或您在接收方所做的任何事情将其向上推送。
当使用 UDP 时,接收方不知道是否有任何数据包在途中,所以它只是尝试 recvfrom
1024 字节并完成。它不知道也不应该关心是否有更多数据在传输途中。这由你来处理。