2013-10-22 80 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 !!感謝您的評論;) –