2012-11-29 105 views
0

我試圖使用write()命令寫入套接字。我需要寫入的數據是結構類型,它包含charint數據類型值。但是,當我將數據寫入服務器套接字時,int變量的值被損壞。我總是收到價值爲16777216讀取()和寫入()到套接字返回損壞值

我從Solaris機器寫入Linux機器。 Solaris是一個32位機器,Linux是一個64位機器。這對我的問題有什麼影響嗎?

我使用htonl/ntohl,反之亦然,用於將int埃格爾值從服務器傳遞給服務器。但是如果我將整個結構類型寫入套接字,我該如何使用它?任何人都可以幫我解決這個問題嗎?

PCHAR data = NULL; 
int size = sizeof(WSMsg); 
int retry = 10; 
data = new char [sizeof(WSMsg)]; 
memcpy(data, msg, sizeof(WSMsg)); 
int n = write(fd, &data[0], size); 

這是我的代碼部分。這裏WSMsg是結構類型,並有intchar類型的值。

我正在從數據庫表中寫入一個包含數字char類型值的特定行。我正在寫這樣的不同行的不同表格。所以如果我需要使用htonl/ntohl那麼我需要將所有這些數字轉換爲網絡字節。由於我有20個或更多的表格及其具有整數類型值的結構,因此對於我來說,將所有這些數據轉換併發送都是一項耗時的工作。

+3

爲什麼不直接用結構調用'write'?即'write(fd,msg,sizeof(WSMsg))' –

+0

我可以這樣做,但是當我在另一端收到數據時,我的整數值會被損壞。如果我將數據從Solaris傳輸到Solaris或從Linux傳輸到Linux,那麼一切正常。當我從Solaris寫入Linux時,問題就出現了,反之亦然。 –

+0

「Solaris」通常意味着「SPARC」是大端,而「Linux」通常意味着「x86或ARM」。因此寫一個完整的結構導致腐敗並不令人驚訝。 – Damon

回答

2

看來你有字節順序的問題。有幾種不同的方法可以解決這個問題:一種方法是查看serialization,即將發送的結構轉換爲獨立於字節順序問題的格式;另一個解決方案是創建您的結構的副本,並使用例如htons/htonl需要的地方:

WSMsg temp = *msg; 
temp.someShortField = htons(temp.someShortField); 
// etc. 

然後當然做在接收側相反。