如何转储TCP客户端的缓冲区以接受更多数据?

时间:2010-10-11 00:11:00

标签: python tcp

我有一个简单的TCP服务器和客户端。客户端接收数据:

received = sock.recv(1024)

这似乎微不足道,但我无法弄清楚如何接收比缓冲区更大的数据。我尝试将数据分块并从服务器发送多次(为UDP工作),但它只是告诉我我的管道坏了。

建议?

3 个答案:

答案 0 :(得分:1)

如果您不知道有多少数据要通过套接字,并且您只是想在套接字关闭之前读取所有内容,那么您需要将socket.recv()置于循环中:

# Assumes a blocking socket.
while True:
    data = sock.recv(4096)
    if not data:
        break
    # Do something with `data` here.

答案 1 :(得分:1)

迈克的答案是你正在寻找的答案,但这不是你想要发现自己的情况。你应该开发一种使用固定长度字段的线上协议,该字段描述了数据的进展情况被发送。这是一个Type-Length-Value协议,您可以在网络协议中一次又一次地找到它。它可以为您的协议提供针对不可预见的要求,并有助于将网络传输问题与程序化问题隔离开来。

发送方变得类似:

socket.write(struct.pack("B", type)         #send a one-byte msg type 
socket.write(struct.pack("H", len(data))    #send a two-byte size field
socket.write(data)

接收方如下:

type = socket.read(1)                                 # get the type of msg
dataToRead = struct.unpack("H", socket.read(2))[0]    # get the len of the msg
data = socket.read(dataToRead)                        # read the msg

if TYPE_FOO == type:
    handleFoo(data)

elif TYPE_BAR == type:
    handleBar(data)

else:
    raise UnknownTypeException(type)

您最终会得到一种类似于以下内容的线上消息格式:

struct {
     unsigned char type;
     unsigned short length;
     void *data;
}

答案 2 :(得分:0)

请记住:

  • 您的操作系统有自己的想法,它的TCP / IP套接字缓冲区大小是什么。
  • TCP / IP数据包最大大小(通常为1500字节)
  • pydoc for socket表明4096是一个很好的缓冲区大小

话虽如此,看到围绕这一行的代码真的很有帮助。有一些事情可以发挥作用,如果你使用select或只是轮询,套接字是非阻塞等等。

如果您的远程终端断开连接,那么您发送数据的方式也很重要。更多细节。