我有一个绑定到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字节的数据。
答案 0 :(得分:6)
如果您还不知道数据包的大小,则应始终使用65535
(UDP数据包的最大大小)调用recv。否则,当您调用recv
时,整个数据包将被标记为已读并从缓冲区中清除,但只有第一个128
字节被送入msg_received
。
修改:当您(如果)转换为仅通过网络接收数据时,您可以使用较小的数字recv
,如Docs中所述
答案 1 :(得分:1)
如果您知道自己将获得4500字节的数据,则可以致电receiver_socket.recv(4500)
您的代码所说的是最大字节要读取为128 receiver_socket.recv(128)