我們的應用程序是與Windows Java客戶端進行通信的C服務器(此問題針對所述服務器的Windows端口)。在這個特定的實例中,我們正在向客戶端發送數據,特別是,消息由一個7字節的頭部組成,其中前3個字節都有特定的含義(op類型,標誌等),最後4個字節包含其餘的消息。出於某種原因,我絕對無法弄清楚,標題中的第三個字節以某種方式變化;如果我在send()
上設置了一箇中斷點,我可以看到第三個字節是我期望的(0xfe
),但是當我檢入客戶端時,該字節設置爲0.其他每個字節都可以。 A用WireShark做了一些流量捕獲,發現該字節爲0,離開服務器,我發現它更令人困惑。第三個字節是通過定義,阿拉設置:爲什麼我在send()函數中丟失了這個字節?
#define GET_TOP_FRAME 0xfe
一些測試我這樣做,進一步混淆了問題:
- 我使用的定義來改變價值第一
0x64
,0xff
,0xfd
:都發現了客戶。 - 我將使用定義的值更改爲使用
0xfe
本身:客戶端的值爲零。 - 我將定義本身的值從
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
是以前放在一起插座,protocolByte
,op
和bytes
預先設置。然後它在這個消息之後立即發送一個非常類似的發送命令。正如我所提到的,如果我在該發送函數上放置了一個斷點,tbuffer就包含了我期望的內容。
有人有什麼想法嗎?我完全難倒了;這對我來說沒有任何意義。謝謝。
完整的7字節數據包在線? (根據wireshark?) – pm100 2010-02-12 17:23:39
是的。根據Wireshark的說法,我希望在那裏存在除了那個神奇地轉化的單個字節以外的其他東西。 – Morinar 2010-02-12 17:28:11
您是否嘗試禁用編譯器優化? – mark4o 2010-02-12 17:29:37