2015-11-04 32 views
0

我使用struct.pack/unpack.encoding('ascii')爲從一個字符到另一個字符的窗口編寫了一個客戶端服務器。我想看看它是否能在ubuntu上正常工作,當我檢查時,我得到一個錯誤,它無法解壓我的數據,甚至沒有整數。Python結構不能在Linux下工作。編碼?

的錯誤是在這裏,在服務器中,當我嘗試接收和解壓數據

nr1 = c.recv(4096) 
nr1 = struct.unpack('!i',nr1)[0] 

它說,它需要4個字節的字符串參數,但我要送一個int ...經過一番研究,我明白它一定是編碼相關的東西,但沒有別的。任何想法,爲什麼它不工作?

這裏就是我送(從客戶端)的INT部分:

a = [1,2,3,4] 
nra = len(a) 
c.send(struct.pack('!i',nra)) 

enter image description here enter image description here

+0

'unpack'從字符串變爲整數(或任何其他的格式字符串指定)。也許你想'struct.pack()'而不是,如果你的輸入是一個整數,你想要一個字符串? –

+0

...說,'recv()'肯定會返回一個字符串,所以我懷疑你說你發送一個int的地方,這是錯誤的。 –

+0

...不管怎樣,在點之前查看'nr1'的* actual *內容。它是否太短(所以你需要'recv()'來獲得更多的內容)?它是否太長(以致它不再符合格式字符串的說明符)?如果不是'nr1 = c.recv(4096)'你包含'nr1 ='...這裏有一個實際的字符串...',那麼人們可能會重現你的錯誤,而不需要一個接收你可以看到的數據的套接字,但是沒有人可以。 –

回答

0

如果你拆包一個4字節的整數,你應該只收到4個字節:

nr1 = c.recv(struct.calcsize('!i')) 
nr1 = struct.unpack('!i',nr1)[0] 

推測,在Windows系統中,系統調用返回時只能接收4個字節的數據包;當時Linux似乎準備好了更多的數據。

如果你想獲得更大的一組內容,但只有拆開前四個字節,這也是可能:

nr1 = c.recv(4096) 
nr1 = struct.unpack('!i', nr1[:struct.calcsize('!i')])[0] 
+0

好吧,你是對的。在代碼中的每個地方都改變了recv中的數字和正確的字節數之後,所有東西都完美無缺。非常感謝你 – Mocktheduck