簡體   English   中英

struct.pack()Python未知字段的長度,通過套接字發送

[英]struct.pack() Python unknown fields length to send through a socket

我正在用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)

在那些示例中,僅是標題,我的意思是,我已經知道其長度的字段,如何添加主體字段?

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 )

為了清楚起見,我將身體大小與其他字段分開了,但是您可以將它們組合在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM