Hi All
I am trying to write in Linnux a client in C++ using boost::asio
data from a socket. The server is built in Java. The issue I have now is that I cannot read correctly some piece of information from the socket. If the client is done in JAVA everything is ok.
In details the big error I have are in receiving the unsigned long
and the int
in the structure below. I am expectng a value for anInteger
should be 0x00000005
so 5, but reading from the socket gives me 0x03000
( ?!?! ). It is definetely a different number and based on the hexadecimal printing I have less digits( ?!?!? ).
For aUnLong
I should receive something approaching to a number 1279272977799 so in hex is 0x129DA9C8587
, instead a receive something like 0x00129ffffffdaffffff8fffffff9f5c
. I see that some piece of information is good but it is mixed with all ff
s and where I don't know where they come from.
I am guaranteed to receive each time 168 bytes ( so fixed number of bytes ).
In the beginning I though about the data alignment of my structure so I introduced attribute((packed))
.
The label
and lbl_2
are string; I now that JAVA uses UTF but it is not clear to me how this play in this scenario.
Can you help me with this issue?
I thank you very much.
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 };
Reading happens using this simple line
MyStruct obj; size_t reply_length = asio::read( s,asio::buffer(obj.buffer, 168));
this is the original format sent out
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