現在、C++ for Linuxでソケットラッパーを作成中です。基本的には、TCPソケットの作成、接続、送信、読み取り、および終了を処理するクラスのコレクションです。C++ソケットは最初の4バイトのデータのみを送信します
私のソケットクラスでは、send関数とreceive関数以外のすべての関数がうまく機能します。彼らはエラーを返さない。代わりに、最初の4バイトのデータのみを送信します。
マイ送信機能:その背後にある
int Socket::sends(char* buffer){
int bytes; // for number of bytes sent
/* First, send the size of buffer */
int datalen = strlen(buffer); // get sizeof buffer
int len = htonl(datalen); // reformat
// send the size of the buffer
bytes = send(socketfd, (char*)&len, sizeof(len), 0); // send the size
if (bytes < 0){
cerr << "Error sending size of buffer to socket" << endl;
return 1;
}
/* Now acutally send the data */
bytes = send(socketfd, buffer, datalen, 0);
if (bytes < 0){
cerr << "Error writing buffer to socket" << endl;
return 1;
}
cout << bytes << " written" << endl;
return 0;
}
アイデアは、それが最初のバッファのサイズを送信した後、実際のバッファを送信することにより、バッファ(char* buffer
)を送ることです。エラーが発生した場合(帰国-1)関数は今1
を返すことによって終了し、ここでの読み取り方法は次のとおりです。ここで
int Socket::reads(char* buffer){
int bytes, buflen; // for bytes written and size of buffer
/* Read the incoming size */
bytes = recv(socketfd, (char*)&buflen, sizeof(buflen), 0);
if (bytes < 0){
cerr << "Error reading size of data" << endl;
return 1;
}
buflen = ntohl(buflen);
/* Read the data */
bytes = recv(socketfd, buffer, buflen, 0);
if (bytes < 0){
cerr << "Error reading data" << endl;
return 1;
}
return 0;
}
、アイデアは、最初のデータのサイズを読み取ることで、バッファをそのサイズに設定して読み込みます。関数はエラー時に1を返します(recvは-1を返します)。メソッドを使用して
は次のようになります。
socket.sends("Hello World"); // socket object sends the message
char* buffer;
socket.reads(buffer); // reads into the buffer
しかし、私はこれらの関数を使用し、これまで、私は奇妙な、非ASCII文字に続いて、データの最初の4つのバイトを受信したとき。なぜこのようなことが起こるのか分かりません。 send
とrecv
関数でエラーは発生せず、関数は4バイトしか書き込まれていないと言っています。データを送受信する方がいいですか?私は非常に単純なエラーを見落としていますか?
ありがとうございました!
をしてください避けるために
std::string
またはstd::vector<char>
で行うことができます。関連するタグのみを使用してください。 – kaylum読み取りに十分なメモリが割り当てられていることをどのように知っていますか?サンプルコードは 'buffer'という名前のポインタを作成しますが、割り当てられたメモリを指しません。 –
ブロックされていないソケットを使用している場合、 'recv'は0を含む任意のバイト数を読み込みます。すべてのデータがあるかエラーが返されるまで' recv'を呼び出す必要があります。 – alain