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 ffs 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