Я пытаюсь создать программу, которая отправляет информацию (набор символов) в другую программу (клиент / сервер) с помощью winsock для моего школьного проекта.
сообщение, которое я отправляю, получено на другой стороне, но с дополнительными символами в конце. И.Е. если я хочу послать «привет», я получу «hallod3» или несколько случайных символов.
P.S: сообщение отправлено с клиента на сервер
вот мой код на сервере:
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
do {
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
ShowMessage(recvbuf);
}
else if (iResult == 0)
ShowMessage("Connection closing...\n");
else {
ShowMessage("recv failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
ShowMessage("send failed");
}
} while (iResult > 0);
и вот клиент:
char sendbuf[DEFAULT_BUFLEN];
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
ShowMessage("send failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
ShowMessage("send failed");
}
Определяется DEFAULT_BUFLEN (длина сообщения), ShowMessage () — это функция из компонента VCL (я использую Borland C ++ Builder), которая принимает строку и отображает ее.
П.С .: Я позаботился о строке ‘sendbuf’ в клиенте, и в ней нет лишних символов, я даже добавляю ‘\ 0’ в конце строки.
в чем может быть проблема здесь?
Он не «получен с дополнительными символами». Просто вы игнорируете iResult при отображении буфера приема. Это справедливо только для байтов iResult, но не для всего.
число, возвращаемое strlen, не включает символ ‘\ 0’, поэтому символ ‘\ 0’ не отправляется.
Кроме того, вам не гарантировано получение всего сообщения за один вызов recv.