Winsock2 래퍼 클래스 (클라이언트 - 서버)에 문제가 있고 혼란에 빠져있는 수많은 시간 후에 혼란 스러웠습니다. 당신의 의견.C++, Send() 함수가 여분의 바이트를 보냅니다.
더 구체적으로 말하자면, 문제는 클라이언트 (항상)가 아닌 Send() 함수를 사용할 때마다 하나 또는 두 개의 추가 바이트가 전송된다는 것입니다.
예를 들어 SendBytes ("Hello")를 사용하고 Recv 함수는 문자 배열 끝에 '•'또는 다른 임의의 문자가있는 "Hello?"를 반환합니다. 물론
//main.cpp (Client)
#include "Socket.h"
int main()
{
NetworkService::Client cService = NetworkService::Client();
int res = cService.Initialize("127.0.0.1","20248");
if(res == 0){
int local = cService.SendBytes("Hello!");
printf("Bytes Sent: %ld\n", local);
cService.Shutdown();
char* temp = cService.Recv();
printf("String Recieved: %s - Size: %d",temp,strlen(temp));
printf("\nSTRLEN: %d",strlen("X5"));
}
else{
cService.Clean();
}
cService.Close();
while(!kbhit());
return 0;
}
, 서버는 "X5"문자열을 전송하고 클라이언트는 strlens을 인쇄 ...
//The result with "X5" as the dummy text:
String Recieved: X5? - Size: 3 //Notice the extra '?' character
STRLEN: 2
보내기 // 받으십시오 기능
int NetworkService::Client::SendBytes(char* lData){
int local = send(ConnectSocket, lData, (int)strlen(lData), 0);
if (local == SOCKET_ERROR) {
Close();
return WSAGetLastError();
}
return local;
}
char* NetworkService::Client::Recv(){
recv(ConnectSocket, recvbuf , recvbuflen, 0);
return recvbuf;
}
도움을 주시면 감사하겠습니다^_ ^.
문자열에 종료 NUL 바이트를 보내지 않습니다. –
너무 빨리 답변 해 주셔서 감사합니다! Heres, 나는 문자열 끝에 '\ 0'을 추가했으나 아무것도하지 않았다. 나는 여전히 무작위 삽입을 얻는다. – Christian
@christian : 문자열 리터럴을 통해 암시적인 \ 0을 이미 갖고 있습니다. 그것을 보내기 위해서는 send() 호출에서 size 매개 변수를 조정해야합니다. strlen (lData)에서 strlen (lData) +1로 변경하여 후행 \ 0을 포함시킵니다. 왜 이것이 필요한지 확실하지 않다면 [strlen()] (http://cplusplus.com/reference/clibrary/cstring/strlen/) 함수를 찾아보십시오. – ComicSansMS