从UDP套接字读取所有数据(Reading all the data from a UDP sock

2019-09-18 02:53发布

情况:

我有这势必本地主机的UDP端口33100.我有一个绑定到本地主机的UDP端口33101一receiversocket插座sendersocket。

发送方插口发送4500个字节的数据(字符串“hello人” * 500)。 在接收机侧,我有等待在receiversocket的EPOLLIN事件的epoll的对象。 当有一个事件,我做的:

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个字节的数据。

Answer 1:

你应该总是调用带有的recv 65535 (UDP数据包的最大尺寸),如果你还不知道数据包的大小。 否则,当调用recv ,整个分组被读取和从缓冲器清零,但随后仅第一标记128个字节被馈送到msg_received

编辑 :当(如果)你过渡到只有通过网络接收数据时,可以使用一个较小的数量recv ,如在所提到的文档



Answer 2:

如果你知道你会得到4500个字节的数据,你可以调用receiver_socket.recv(4500)

你的代码的意思是, 最大读取字节是128 receiver_socket.recv(128)

见的插座Python文档



文章来源: Reading all the data from a UDP socket