Проблемы при отправке целочисленного массива через сокет

Я посылаю целочисленный массив от клиента к серверу через сокет. Как это ;

int arr[3] = {5, 4, 1};send(sock , &arr, 3 , 0);   //sending the votes count

и получать на сервере, как это так

recv(new_socket, arr1, 3, 0);

Я получаю правильное значение в arr1[0] но в arr1[1] я собираюсь 66 а также arr1[2] я собираюсь 67

Я не знаю, как это происходит и где 66 а также 67 исходит от

0

Решение

send() а также recv() работать только с байтами. Вы отправляете и получаете 3 байта, но ваш массив на самом деле sizeof(int) * 3 байт вместо (где sizeof(int) обычно 4 на многих платформах). Вам нужно использовать sizeof() на обоих концах, например:

send(sock, &arr, sizeof(arr), 0);

recv(new_socket, &arr1, sizeof(arr1), 0);

Тем не менее, вы также должны обратить внимание на возвращаемые значения, потому что send() может отправить меньше байтов, чем запрошено, и recv() может получить меньше байтов, чем запрошено. TCP ориентирован на поток, а не на сообщения. Вы должны звонить send() а также recv() каждый в цикле, повторно вызывая каждый, пока все ожидаемые байты не были отправлены / получены полностью, например:

ssize_t sendAll(int sckt, void *data, size_t length)
{
char *bytes = (char*) data;
while (length > 0)
{
ssize_t sent = send(sckt, bytes, length, 0);
if (sent == -1) return -1;
bytes += sent;
length -= sent;
}
return 0;
}

int arr[3] = {5, 4, 1};
sendAll(sock, &arr, sizeof(arr));

ssize_t recvAll(int sckt, void *data, size_t length)
{
char *bytes = (char*) data;
while (length > 0)
{
ssize_t recvd = recv(sckt, bytes, length, 0);
if (recvd <= 0) return recvd;
bytes += recvd;
length -= recvd;
}
return 1;
}

int arr1[3];
recvAll(new_socket, &arr1, sizeof(arr1));
2

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

Других решений пока нет …

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