Я передаю struct over socket с помощью c++. Я прочитал некоторые более ранние вопросы по отправке структур, и один из предложенных методов заключался в передаче с использованием символа char * after cast. Так как сервер и клиент находятся на одной машине, поэтому здесь нет проблем с контентом.
Здесь пара вопросов. Я получаю размер структуры как 48. По моим расчетам не должно быть 43? 8x4 + 10 +1
Во-вторых, на стороне сервера, когда я печатаю полученный буфер, я получаю только текстовые элементы. Длинные целые числа не принимаются.
struct testStruct{
char type;
char field1[10];
char field2[8];
char field3[8];
long num1, num2;
};
testStruct ls;
ls.type = 'U';
strcpy(ls.field1, "NAVEENSHAR");
strcpy(ls.field2, "abcd1234");
strcpy(ls.field3, "al345678");
ls.num1 = 40;
ls.num2 = 200;
char* bytes = static_cast<char*>(static_cast<void*>(&ls));
bytes_sent = send(socketfd, bytes, sizeof(ls), 0);
cout << "bytes sent: " << bytes_sent<< "\n";
//On server sidechar
incomming_data_buffer[1000];
bytes_recieved = recv(new_sd, incomming_data_buffer,1000, 0);
cout << "|" << incomming_data_buffer << "|\n";
Он отображает 48 байтов и нет целых чисел, которые я добавил. Любая идея о том, почему это может произойти. Я прочитал об отправке структур с использованием синтаксиса, но в то же время, что накладные расходы огромны для простых структур.
Вы почти наверняка получаете все данные. Проблема заключается в этой строке:
cout << "|" << incomming_data_buffer << "|\n";
который печатает incomming_data_buffer
как строку стиля C, поэтому останавливается при первом нулевом байте. Так как ваши long
значения закодированы в двоичном формате, там будут, по крайней мере, нули (в полях между полями также могут быть нули).
Вы можете попробовать сделать что-то вроде:
cout << "|";
for (int i = 0; i < bytes_received; i++)
{
cout << hex << (((int)incomming_data_buffer[i]) & 0xff) << " ";
}
cout << "|\n";
для отображения всех байтов полученного пакета.
invalid operands of type int and char[2] for operator <<
& 0xff
. Сейчас отредактировано.
sizeof(testStruct)
- 48 из-за выравнивания .long
s должны быть выровнены поsizeof(long)
границы, которая, по-видимому, составляет 8 байт на вашем компьютере.char
другой стороны,char
должны быть выровнены только на 1 байт. У вас есть 27 байтов для первых четырех членов, поэтому компилятор должен добавить дополнительные отступы (5 байтов) междуfield3
иlong
для выравнивания для работы. Таким образом, 27 + 5 байтов = 32 байта, обеспечивая правильное выравнивание для двухlong
s (и объясняет 5-байтовое расхождение).