4

情况:

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

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

4

2 回答 2

7

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

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

于 2012-06-14T04:32:39.190 回答
1

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

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

请参阅套接字的 python 文档

于 2012-06-14T03:39:56.343 回答