我正在嘗試在Linnux中使用來自套接字的boost::asio
數據在C++中編寫客戶端。該服務器是用Java構建的。我現在的問題是我無法正確地從套接字讀取一些信息。如果客戶端是用JAVA完成的,一切都可以。在C++中讀取由Java +結構對齊打開的套接字
詳細我在接收unsigned long
和int
下面的結構中的大錯誤。我期望值爲anInteger
應該是0x00000005
所以5,但從插座讀取給我0x03000
(?!?!)。它定義了一個不同的數字,並且基於十六進制打印,我有更少的數字(?!?!?)。
對於aUnLong
我應該收到一些接近數字1279272977799所以在十六進制是0x129DA9C8587
,而不是像0x00129ffffffdaffffff8fffffff9f5c
接收東西。我發現一些信息很好,但它與所有ff
s混合在一起,我不知道它們來自哪裏。
我保證每次接收168個字節(所以固定的字節數)。 一開始我雖然關於我的結構的數據對齊,所以我介紹了attribute((packed))
。
label
和lbl_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
如果不知道Java服務器使用什麼協議和/或序列化格式,就很難提供任何幫助。 – 2010-07-16 10:11:16
我們需要知道Java服務器發送的消息的格式。 – nos 2010-07-16 11:23:24