代码之家  ›  专栏  ›  技术社区  ›  Brian D

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

  •  0
  • Brian D  · 技术社区  · 14 年前

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

    received = sock.recv(1024)
    

    这看起来很简单,但我不知道如何接收大于缓冲区的数据。我试着将数据分块并从服务器发送多次(适用于UDP),但它只是告诉我我的管道坏了。

    建议?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Mike DeSimone    14 年前

    如果您不知道有多少数据将倾泻到套接字上,而您只想读取所有内容,直到套接字关闭,那么您需要 socket.recv()

    # Assumes a blocking socket.
    while True:
        data = sock.recv(4096)
        if not data:
            break
        # Do something with `data` here.
    
        2
  •  1
  •   J.J.    14 年前

    迈克的答案是你要找的,但那不是你想让自己陷入的境地。您应该开发一个over-the-wire协议,它使用一个固定长度的字段来描述要发送多少数据。是一个 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)
    

    最后,您得到的是一个over-the-wire消息格式,如下所示:

    struct {
         unsigned char type;
         unsigned short length;
         void *data;
    }
    
        3
  •  0
  •   synthesizerpatel    14 年前

    • 您的操作系统对TCP/IP套接字缓冲区大小有自己的想法。

    尽管如此,看到这一行的代码会很有帮助。如果您正在使用select或只是轮询,那么有一些东西可以发挥作用,比如套接字是非阻塞的,等等。

    推荐文章