2010-02-12 90 views
1

我們的應用程序是與Windows Java客戶端進行通信的C服務器(此問題針對所述服務器的Windows端口)。在這個特定的實例中,我們正在向客戶端發送數據,特別是,消息由一個7字節的頭部組成,其中前3個字節都有特定的含義(op類型,標誌等),最後4個字節包含其餘的消息。出於某種原因,我絕對無法弄清楚,標題中的第三個字節以某種方式變化;如果我在send()上設置了一箇中斷點,我可以看到第三個字節是我期望的(0xfe),但是當我檢入客戶端時,該字節設置爲0.其他每個字節都可以。 A用WireShark做了一些流量捕獲,發現該字節爲0,離開服務器,我發現它更令人困惑。第三個字節是通過定義,阿拉設置:爲什麼我在send()函數中丟失了這個字節?

#define GET_TOP_FRAME 0xfe 

一些測試我這樣做,進一步混淆了問題:

  1. 我使用的定義來改變價值第一0x640xff0xfd:都發現了客戶。
  2. 我將使用定義的值更改爲使用0xfe本身:客戶端的值爲零。
  3. 我將定義本身的值從0xfe更改爲0xef:客戶端的值爲零。

沒有關於這個讓人感覺舔。該代碼經過的職能幾個等級,但在這裏是最核心代碼:

int nbytes; /* network order bytes */ 
static int sendsize = 7; 
unsigned char tbuffer[7]; 
tbuffer[0]= protocolByte; 
tbuffer[1]= op; 
tbuffer[2]= GET_TOP_FRAME; 
nbytes = htonl(bytes); 
memcpy((tbuffer+3), &nbytes, JAVA_INT); 

send(fd, tbuffer, sendsize, 0); 

fd是以前放在一起插座,protocolByteopbytes預先設置。然後它在這個消息之後立即發送一個非常類似的發送命令。正如我所提到的,如果我在該發送函數上放置了一個斷點,tbuffer就包含了我期望的內容。

有人有什麼想法嗎?我完全難倒了;這對我來說沒有任何意義。謝謝。

+0

完整的7字節數據包在線? (根據wireshark?) – pm100 2010-02-12 17:23:39

+0

是的。根據Wireshark的說法,我希望在那裏存在除了那個神奇地轉化的單個字節以外的其他東西。 – Morinar 2010-02-12 17:28:11

+0

您是否嘗試禁用編譯器優化? – mark4o 2010-02-12 17:29:37

回答

0

結果發現了其他一些方法:除了C服務器之外,我們還有一個Tomcat/Java服務器,它可以運行在所有服務器上;我會誠實的說,我沒有參與這樣的發展,所以我不太瞭解它。事實證明,我們有一些在middletier部分和我們客戶之間共享的代碼;這個共享代碼在離開服務器時採用了特定的字節,如果設置爲0xfe,則將其設置爲未初始化的值(因此爲零)。然後,當它到達客戶端時,這是錯誤的。這就是爲什麼當我在C代碼中將值設置爲不同的東西時,它會將其轉到另一端,以及爲什麼行爲看起來不一致;我在Java中切換了相當多的值來看看發生了什麼。

感謝所有的指針,但事實證明,這僅僅是我沒有正確理解路徑的情況。

1

這可能是因爲系統中某處發生了簡單的緩衝區溢出或類似的錯誤,但在給出這些小信息的情況下很難說出位置。但是,請記住:

TCP不發送消息 - 這是一個流。一個send()調用可能需要幾個recv()調用來接收。一個recv調用可能會收到應用程序定義的部分「消息」。

您是否正在檢查send的返回值? recv的返回值是什麼?發送可能發送的字節數少於告訴它的數量。 recv可能收到的字節數比您告訴的要少,或者如果您給它一個足夠大的緩衝區,它可能會接收比您的應用程序「消息」更多的數據。

+0

好點。我們實際上在循環中調用send()來檢查發送的字節,所以我們可以保證我們正在發送所有內容。客戶端的接收代碼被抽象了一點,所以它不會很明顯,一旦我確定由於Wireshark數據導致問題出現在服務器上,我就不再重視它了。 – Morinar 2010-02-12 17:21:42

相關問題