在Python中使用套接字recvfrom接收多播数据

时间:2018-02-15 12:56:34

标签: python sockets udp multicast

我有一个组播服务器发送必须由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...

1 个答案:

答案 0 :(得分:0)

有一件事是肯定的,多播基本上是发送UDP包,你必须继续监听新的包。即使对于基于TCP协议的通信也是如此。

当您使用低级接口进行网络通信时,如socket,双方都可以定义应用级协议。

这意味着,您可以定义接收方如何断定该消息是否完整。这是因为消息可能会分成通过网络的多个部分/数据包。因此,接收方必须以适当的方式组装它们,然后检查消息是否完整。之后,你将其推送到处理消息的管道或你在接收方做的任何事情。

使用UDP时,接收方不知道路上是否有任何数据包,所以它只会尝试recvfrom 1024字节并完成。它不知道也不应该关心它是否有更多的数据。由你决定照顾它。