Python socket.recv过早关闭套接字

时间:2018-02-10 22:38:20

标签: python-2.7 sockets tcp telnet recv

我有一个Web代理,它启动一个TCP侦听器套接字,接受来自客户端的连接。监听器通过以下方式接受连接:

clientConnection, clientAddress = listenerSocket.accept()

然后一个新线程从那里处理客户端连接。

要模拟客户端连接,我使用telnet连接到代理并发出命令。代理需要从telnet接收数据,我需要确保收到所有数据。为实现这一目标,我正在做以下事情:

while True:
    requestBytes = clientConnection.recv(1024)

    if not requestBytes:
        break

    requestBuffer += requestBytes

代理然后对字节进行解码并用它们做一些花费一点时间的事情,然后必须将响应发送回同一个客户端。但是,当使用上面的代码时与clientConnection的连接在我处理字节并响应之前很久就会关闭。

以下是我不理解的内容,当我使用以下内容时:

while True:
    requestBytes = clientConnection.recv(1024)
    requestBuffer += requestBytes
    break

它工作正常,clientConnection保持不变。如果我收到超过1024个字节,但clientConnection 关闭,这显然有问题。

更具体地说,在我收到发送到客户端的响应并调用后发生错误:

clientConnection.sendall(response)
clientConnection.shutdown(1)
clientConnection.close()

clientConnection.shutdown(1)行会引发错误:

[Errno 107] Transport endpoint is not connected

这令人困惑,因为不知何故它仍能在前一行调用sendall请注意,我实际上并没有在客户端收到任何内容。

我确信连接没有在代码中的其他位置关闭。这里究竟发生了什么,以及recvall 这样做的最佳方式是什么?让clientConnection保持开放状态?

0 个答案:

没有答案