Я посылаю целочисленный массив от клиента к серверу через сокет. Как это ;
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
исходит от
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));
Других решений пока нет …