Сервер не получает конечные длинные значения в сокете c ++

0

Я передаю 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 байтов и нет целых чисел, которые я добавил. Любая идея о том, почему это может произойти. Я прочитал об отправке структур с использованием синтаксиса, но в то же время, что накладные расходы огромны для простых структур.

  • 1
    sizeof(testStruct) - 48 из-за выравнивания . long s должны быть выровнены по sizeof(long) границы, которая, по-видимому, составляет 8 байт на вашем компьютере. char другой стороны, char должны быть выровнены только на 1 байт. У вас есть 27 байтов для первых четырех членов, поэтому компилятор должен добавить дополнительные отступы (5 байтов) между field3 и long для выравнивания для работы. Таким образом, 27 + 5 байтов = 32 байта, обеспечивая правильное выравнивание для двух long s (и объясняет 5-байтовое расхождение).
  • 1
    Также обратите внимание, что ваши строковые поля слишком малы для строк, которые вы копируете в них - очевидно, вы не допустили терминатор \ 0. В будущем используйте strcpy, чтобы избежать повреждения памяти при возникновении такой ошибки.
Показать ещё 6 комментариев
Теги:
struct
sockets

1 ответ

2
Лучший ответ

Вы почти наверняка получаете все данные. Проблема заключается в этой строке:

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";

для отображения всех байтов полученного пакета.

  • 0
    Я попробовал это, но получил некоторые странные ошибки cout, которые invalid operands of type int and char[2] for operator <<
  • 0
    Нужен другой набор скобок вокруг математического выражения с & 0xff . Сейчас отредактировано.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню