отправка int через сокет, c, переполнение стека

У меня проблемы с отправкой массива целых через сокет.
код выглядит так

Программа 1 (работает на Windows)

int bmp_info_buff[3];

/* connecting and others */

/* Send informations about bitmap */
send(my_socket, (char*)bmp_info_buff, 3, 0);

Программа 2 (работает на нейтрино)

/*buff to store bitmap information size, with, length */
int bmp_info_buff[3];

/* stuff */

/* Read informations about bitmap */
recv(my_connection, bmp_info_buff, 3, NULL);
printf("Size of bitmap: %d\nwidth: %d\nheight: %d\n", bmp_info_buff[0], bmp_info_buff[1], bmp_info_buff[2]);

Это должно напечатать
Размер растрового изображения: 64
ширина: 8
высота: 8

Размер растрового изображения: 64
ширина: 6
высота: 4096
Что я делаю не так?

4

Решение

Когда вы отправляете bmp_info_buff массив как массив символов, размер bmp_info_buff не 3, но 3 * sizeof(int)

То же самое для recv

замещать

send(my_socket, (char*)bmp_info_buff, 3, 0);
recv(my_connection, bmp_info_buff, 3, NULL);

от

send(my_socket, (char*)bmp_info_buff, 3*sizeof(int), 0);
recv(my_connection, bmp_info_buff, 3*sizeof(int), NULL);
7

Другие решения

Размер аргумента для send() а также recv() в байтах, не ints. Вы отправляете / получаете слишком мало данных.

Тебе нужно:

send(my_socket, bmp_info_buff, sizeof bmp_info_buff, 0);

а также

recv(my_connection, bmp_info_buff, sizeof bmp_info_buff, 0);

Также обратите внимание:

  • Это делает ваш код чувствительным к проблемам байтовой байтовости.
  • Размер int это не то же самое на всех платформах, вы должны учитывать это тоже.
  • Не нужно приводить аргумент указателя, это void *,
  • Вы также должны добавить код для проверки возвращаемых значений, ввод / вывод может завершиться ошибкой!
  • Последний аргумент recv() не должно быть NULL как в вашем коде, это целое число флагов, как и в send(),
6

По вопросам рекламы [email protected]