2010-07-16 35 views
0

我正在嘗試在Linnux中使用來自套接字的boost::asio數據在C++中編寫客戶端。該服務器是用Java構建的。我現在的問題是我無法正確地從套接字讀取一些信息。如果客戶端是用JAVA完成的,一切都可以。在C++中讀取由Java +結構對齊打開的套接字

詳細我在接收unsigned longint下面的結構中的大錯誤。我期望值爲anInteger應該是0x00000005所以5,但從插座讀取給我0x03000(?!?!)。它定義了一個不同的數字,並且基於十六進制打印,我有更少的數字(?!?!?)。

對於aUnLong我應該收到一些接近數字1279272977799所以在十六進制是0x129DA9C8587,而不是像0x00129ffffffdaffffff8fffffff9f5c接收東西。我發現一些信息很好,但它與所有ff s混合在一起,我不知道它們來自哪裏。

我保證每次接收168個字節(所以固定的字節數)。 一開始我雖然關於我的結構的數據對齊,所以我介紹了attribute((packed))

labellbl_2是字符串;我現在說JAVA使用UTF,但是我不清楚在這種情況下這種情況。

你能幫我解決這個問題嗎?

我非常感謝你。

EO

 
union MyStruct 
{ 
    char buffer[168]; 

    struct _data{ 
     char   dash[2];  
     unsigned long aUnLong; 
     char   label[128]; 
     char   lbl_2[24]; 
     int   anInteger; 
    } __attribute__((__packed__)); 

    _data data; // the real data 
}; 

閱讀使用會發生這種簡單的線條

 
MyStruct obj; 
size_t reply_length = asio::read(s,asio::buffer(obj.buffer, 168)); 

這是原來的格式發送出去

 
byte 000,001: # 
byte 002-010: aLong (8 byte) long - milliseconds since 1-1-1970 in UTC 
byte 011-139: label (128 byte 2byte per character) label_1 
byte 140-164: lbl2 (24 byte 2byte per character) label2 code 
byte 165-169: anInteger (4 byte) integer 
+3

如果不知道Java服務器使用什麼協議和/或序列化格式,就很難提供任何幫助。 – 2010-07-16 10:11:16

+0

我們需要知道Java服務器發送的消息的格式。 – nos 2010-07-16 11:23:24

回答

1

您的結構並不顯得168個字節共同的系統。如果long是4字節(在32位編譯中是典型的),那麼你的結構可能是162或164,如果壓縮不符合。如果long是8個字節,那麼164或168(如果填充,那麼你猜測是不好的)。

檢查程序中的sizeof(_data),看看編譯器告訴你它是什麼。

此外,您的原始格式信息令人困惑。例如你說「字節002-010:a長(8字節)長」,但字節2-10是9字節而不是8字節。是否有crc或校驗和字節?