2013-10-22 81 views
1

我正在用Python开发一个TCP客户端。我的问题出现在我想将结构发送到服务器时,我使用方法struct.pack()发送和struct.unpack()接收。我有我自己的协议在TCP上,有一些标题,我已经知道它们的长度,但当然,我不知道身体的长度,我怎么能不知道身体的长度包装所有领域?这里有一个例子:struct.pack()Python未知字段通过套接字发送的长度

请求到服务器:从服务器

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) 

在那些例子,仅仅是标题,我的意思是,字段,我已经知道他们的长度,我怎么可以添加身体领域?

+0

身体的类型是什么? – goncalopp

回答

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) 

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

+0

当我从服务器上收集数据时,如何解包? –

+0

@AlvaroGarciadelaVilla你只是'socket.recv'与收到的大小。你可以使用'struct.calcsize'来计算你应该要求接收的大小。看编辑 – goncalopp

+0

Yees !!感谢您的评论;) –