私はWinsock2ラッパークラス(クライアント/サーバー)に問題があります。何度も何度も悩んでいます。あなたの意見。C++、Send()関数が余分なバイトを送信する
具体的には、問題は、Send()関数を使用するたびに、クライアントとサーバーの両方が(必ずしも!)1つまたは2つの余分なバイトを送信することです。
たとえば、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