我有一个组播服务器发送必须由python客户端捕获的数据。问题是recvfrom没有收到任何数据或至少收到第一个数据包并且sorta缓存它。如果我在循环中使用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...
答案 0 :(得分:0)
有一件事是肯定的,多播基本上是发送UDP包,你必须继续监听新的包。即使对于基于TCP协议的通信也是如此。
当您使用低级接口进行网络通信时,如socket
,双方都可以定义应用级协议。
这意味着,您可以定义接收方如何断定该消息是否完整。这是因为消息可能会分成通过网络的多个部分/数据包。因此,接收方必须以适当的方式组装它们,然后检查消息是否完整。之后,你将其推送到处理消息的管道或你在接收方做的任何事情。
使用UDP时,接收方不知道路上是否有任何数据包,所以它只会尝试recvfrom
1024字节并完成。它不知道也不应该关心它是否有更多的数据。由你决定照顾它。