Метод сокета Sendto () отправляет мусор на короткие строки - PullRequest
1 голос
/ 21 февраля 2012

У меня есть сервер и клиент для отправки / получения строки через сокеты Windows.

Код клиента (отправитель):

string c = "Haha";

sprintf(temp.Buffer, c.c_str());
temp.len = c.size();
int sent = 0;
if ((sent = sendto(s, temp.Buffer, temp.len + 1, 0, (SOCKADDR*)&sa_in, sizeof(sa_in))) == SOCKET_ERROR) {
    cout << "Send request method failed\n";
}

Код сервера (получатель):

if (!(outfds = select (1 , &readfds, NULL, NULL, NULL))) {//timed out
    cout << "timed out";
}
if (outfds == 1)
{
    fromlen = sizeof sa_in;
    received = recvfrom(s, buf, 2048, 0, (struct sockaddr*)&sa_in, &fromlen);
}

На сервере я заметил, что если строка, которую я посылаю от клиента, меньше, чем число байтов (например, 0-8 ~), переменная 'buf' содержит мусор в конце. Например, я отправлю строку «ahah», и сервер получит строку, похожую на «ahah0`». Если я отправляю «Hello World», он получает его правильно. Буферы символов в клиенте и на сервере имеют размер 2048.

Решением, которое я нашел для этого, было добавление +1 к длине в методе sendto (). Я не хочу, чтобы это укусило меня в ** позже, если я отправлю что-то больше, чем максимально допустимый размер.

Кто-нибудь знает, откуда это исходит, и есть ли у вас лучшее решение?

Редактировать: количество отправленных и полученных байтов всегда одинаково.

Спасибо

1 Ответ

2 голосов
/ 21 февраля 2012

Вы не передаете трейлинг '\0' char. В вашем протоколе указана строка с нулевым символом в конце? Если так, измените своего клиента таким образом:

sendto( ..., temp.len+1, ...);

Если в вашем протоколе указано, что вы не отправляете нулевое завершение, измените ваш сервер следующим образом:

fromlen = sizeof sa_in;
received = recvfrom(s, buf, 2048, 0, (struct sockaddr*)&sa_in, &fromlen);
if(received >= 0)
    buf[received] = 0;

Если ваш протокол не указывает, то прекратите кодирование сейчас и завершите запись спецификации протокола.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...