代码之家  ›  专栏  ›  技术社区  ›  tipu

在python中使用recv时出现EOF错误

  •  0
  • tipu  · 技术社区  · 16 年前

    我在我的代码中这样做,

    HOST = '192.168.1.3'    
    PORT = 50007              
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    query_details = {"page" : page, "query" : query, "type" : type}
    s.send(str(query_details))
    #data = eval(pickle.loads(s.recv(4096)))
    data = s.recv(16384)
    

    但我总是在最后一行得到EOF。我发送的代码,

    self.request.send(pickle.dumps(results))
    
    1 回复  |  直到 16 年前
        1
  •  8
  •   Alex Martelli    16 年前

    s.send 是 不 保证发送你给它的每一个字节;使用 s.sendall 相反。

    同样地, s.recv 是 不 保证接收你所请求的每一个字节——在这种情况下,你需要通过其他方式确切地知道你需要接收多少字节(例如,首先发送你发送的字符串的长度,用 struct 模块),并且你有责任将自己循环到这个目的。没有也不可能有 recvall 因为流套接字是 不 以任何方式“自定界”——它们只是流,被分解成完全任意大小的、与语义无关的数据包。

    你不应该得到 EOF 从 recv 当然,你也可以期待自己的评论,从 pickle.loads (因为它的论点可能只是 部分 对方发送的字节数:如前一段所述)。

    推荐文章