1

我正在用 Python 开发一个 TCP 客户端。当我想将结构发送到服务器时,我的问题就出现了,我使用struct.pack()发送和struct.unpack()接收的方法。我有自己的 TCP 协议,有一些我已经知道它们长度的标头,但是当然,我不知道正文的长度,我怎么能在不知道正文长度的情况下打包所有字段?这是一个例子:

对服务器的请求:

pack('!BBBBHHII', P2P_h.version, P2P_h.ttl, P2P_h.msgType, P2P_h.reserved, P2P_h.sendPort, P2P_h.payloadLength, P2P_h.ipSrc, P2P_h.messageId)

来自服务器的响应:

queryHit = unpack ("!BBBBHHII", queryResponse)

在这些示例中,只有标题,我的意思是,我已经知道它们的长度的字段,我如何添加正文字段?

4

1 回答 1

1

Python 套接字send`recv对字符串进行操作。通过使用 pack,您已经将其他类型的类型(整数、布尔值...)转换为字符串。假设您的正文只是原始二进制数据 - 一个字符串,即 - 您只需要将已有的字符串与它连接起来。此外,由于正文是可变长度的,您可能还想在消息中发送正文大小,以便您知道要读取的大小recv

data=pack('!BBBBHHII', P2P_h.version, P2P_h.ttl, P2P_h.msgType, P2P_h.reserved, P2P_h.sendPort, P2P_h.payloadLength, P2P_h.ipSrc, P2P_h.messageId) #your current header
data+= pack("!I",len(body)) #assumes len(body) fits into a integer
data+= body #assumes body is a string
socket.send(data)

要接收,请执行相反的操作:

data= socket.recv( struct.calcsize('!BBBBHHII') )
P2P_h.version, P2P_h.ttl, P2P_h.msgType, P2P_h.reserved, P2P_h.sendPort, P2P_h.payloadLength, P2P_h.ipSrc, P2P_h.messageId= unpack('!BBBBHHII', data)
data= socket.recv( struct.calcsize("!I") )
body_size= unpack("!I", data)
body= socket.recv( body_size )

为清楚起见,我将身体尺寸与其他字段分开,但您可以将它们组合起来。

于 2013-10-22T08:51:47.530 回答