从UDP套接字读取所有数据

时间:2012-06-14 03:35:20

标签: python sockets udp

情况:

我有一个绑定到localhost UDP端口33100的sendersocket。 我有一个绑定到localhost UDP端口33101的receiverocket套接字。

发送方套接字发送4500字节的数据(字符串“hello man”* 500)。在接收方,我有一个epoll对象,它等待receiverocket上的EPOLLIN事件。当有事件时,我会这样做:

while True:
    msg_received = receiver_socket.recv(128)
    if msg_received.decode("UTF-8") == "":
        break
    else:
        print msg_received.decode("UTF-8")

问题:

问题是我在读完前128个字节的数据后无法再次读取。发送方表示它按预期发送了4500字节的数据。

如果发送方再次发送相同的4500字节数据,则再次注册EPOLLIN事件并读取新字符串。不知怎的,在我第一次阅读后,缓冲区被清除了。

现在即使发件人只发送了4500字节的数据,第一个recv给了我128字节的数据,然后在此之后没有recv

我可能正在做一些非常愚蠢的事情所以请赐教。我希望收到所有4500字节的数据。

2 个答案:

答案 0 :(得分:6)

如果您还不知道数据包的大小,则应始终使用65535(UDP数据包的最大大小)调用recv。否则,当您调用recv时,整个数据包将被标记为已读并从缓冲区中清除,但只有第一个128字节被送入msg_received

修改:当您(如果)转换为仅通过网络接收数据时,您可以使用较小的数字recv,如Docs中所述

答案 1 :(得分:1)

如果您知道自己将获得4500字节的数据,则可以致电receiver_socket.recv(4500)

您的代码所说的是最大字节要读取为128 receiver_socket.recv(128)

请参阅python documentation for sockets