从UDP套接字读取所有数据

4

情况:

我有一个发送套接字,它绑定到本地主机UDP端口33100。 我有一个接收套接字,它绑定到本地主机UDP端口33101。

发送套接字发送4500字节的数据(字符串“hello man” * 500)。在接收端,我有一个epoll对象,它等待receiversocket上的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个字节的数据。


除了“接收所有4500字节的数据”之外,告诉我们你想做什么。 - eqzx
我想接收它,然后打印出来...就像上面的代码所说的那样... - mmtauqir
2个回答

8

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

编辑:当(如果)您只通过网络接收数据时,可以使用较小的数字来进行recv,如Docs所述。


1
谢谢回复。这个问题基本上给出了相同的答案:https://dev59.com/eE7Sa4cB1Zd3GeqP4IWp 我应该在这些主题上多读一些资料... - mmtauqir

1

如果您知道将要接收4500字节的数据,可以调用receiver_socket.recv(4500)

您的代码表示使用receiver_socket.recv(128)读取的最大字节数为128

请参阅Python套接字文档


我不知道我将会收到4500字节的数据。我可能会收到兆字节的数据...这就是为什么,仅仅为了进行实验,我把recv的大小限制为128字节... - mmtauqir
你在问题中重复了数字4500,并没有说明你期望的数据大小,因此我给出了适合你问题的答案。 - eqzx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接