使用socket.recv()时,程序会在没有更多字节要读取时挂起

时间:2014-08-25 23:00:00

标签: python sockets recv

我在流中收到了几条二进制消息。每个都根据消息中的ID和长度进行解析。我想阅读所有发送的消息;但是,如果我尝试接收的字节多于已发送的字节数,程序会挂起,直到先前设置的socket.settimeout()。

我想怎么处理这个:

while end_of_file == 0:
    header = socket.recv(6)
    if header == '':
        end_of_file = 1

不起作用,因为它总是需要6个字节。

2 个答案:

答案 0 :(得分:3)

你自己说:

  

如果我尝试接收的字节多于已发送的字节数,程序将挂起

如果套接字在阻止模式下运行(这是默认设置),那么您所描述的是正常行为。你告诉它要阅读,它等待新数据到来。

如果你不想让它永远等待,你必须:

  1. 调用socket.settimeout()然后处理timeout异常(如果在阅读期间发生)。

  2. 使用select.select()检测套接字何时有未决数据要读取,然后再调用socket.recv()进行读取。

答案 1 :(得分:2)

除非服务器告诉它,否则客户端不会知道服务器没有发送更多数据。这意味着

  • 服务器必须预先告知客户端预期有多少数据
  • 或服务器将发送一些特殊数据以表明不再有数据
  • 或服务器应该关闭连接,这也表示不再有数据到来(即recv将返回)。请注意,这仅在存在连接时才有效,即使用TCP但不使用UDP。