@sddvxd

Почему буфер приема WinSock заполняется мусором?

Здравствуйте.
Исходники взял с MSDN:
do {
			iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
			if (iResult > 0) {
				iSendResult = send(ClientSocket, recvbuf, iResult, 0);
				if(iSendResult==SOCKET_ERROR){
					printf("send failed with error: %d\n", WSAGetLastError());
					closesocket(ClientSocket);
					WSACleanup();
				}
				for (int i = 0; i < iResult; i++) {
					std::cout << recvbuf[i];
				}
			}
			else if (iResult == 0) {
				//std::cout << "Connection closing...\n";
				std::cout << std::endl;
			}
			else {
				printf("recv failed with error: %d\n", WSAGetLastError());
				closesocket(ClientSocket);
				WSACleanup();
				std::cout << "Error in receive\n";
			}
		} while (iResult > 0);


Проблема состоит в том, что recvbuf почему то содержит какой-то мусор, хотя iResult, допустим если я отправляю 4 байта на сервер - тоже содержит число 4
А если я смотрю strlen(recvbuf) то получаю 16. Откуда берется такой хвост? При выводе recvbuf выводятся первые 4 байта и дальше мусор
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
@res2001
Developer, ex-admin
А если я смотрю strlen(recvbuf) то получаю 16. Откуда берется такой хвост?

В recvbuf вы получаете не с-строку, а массив байт, применять строковые функции к массиву байт бессмысленно.
Отличие с-строки от массива в том, что строка оканчивается завершающим нулем, а в массиве байт вы должны знать длину массива. В с-строке символ 0 не может быть в теле самой строки, только в качестве терминального символа, в массиве байт 0 - такой же равноправный элемент данных, как и все остальные, может быть в любом месте массива или не быть вовсе.
Вам еще повезло, что выдает 16 байт, вместо 4, вполне могло бы сложиться так, что нулевого байта не было бы на достаточно продолжительном участке памяти, тогда был бы просто вылет из программы или какие-либо трудно диагностируемые глюки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы