У меня есть сервер и клиент для отправки / получения строки через сокеты 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 (). Я не хочу, чтобы это укусило меня в ** позже, если я отправлю что-то больше, чем максимально допустимый размер.
Кто-нибудь знает, откуда это исходит, и есть ли у вас лучшее решение?
Редактировать: количество отправленных и полученных байтов всегда одинаково.
Спасибо