0

受信したデータをコピーrecv()します。最大サイズは、入出力バッファーのMAX_PACKETです。

固定サイズでコピーしても大丈夫MAX_PACKETですか?memcpyを使用する場合、バッファの適切なサイズを設定する必要がありますか?

recv(sock,recvbuf,MAX_PACKET,0);
memcpy(inbuffer,recvbuf,MAX_PACKET);
4

5 に答える 5

0

はい、安全ですが無駄です。また、recvbufから実際に受信したデータ以外に、バッファに返されたデータを使用しないことを忘れないでください。

于 2012-05-13T16:56:34.187 に答える
0

inBufferが少なくともMAX_PACKETと同じ大きさでない限り、そうではありません。

Oezbekが言ったことに加えて、recvは、実際に0を受け取らない限り、0を終了しません。

于 2012-05-13T16:58:40.190 に答える
0

別のアプローチ

 std::string inbuffer; // member variable to the class
 .......
 int ret = recv(sock,recvbuff,MAX_PACKET);
 if(ret != 0)
 {
   inbuffer.insert(inbuffer.end(),recvbuff, recvbuff + ret);

 ...... // use the data.
 }

これにより、memcpyの使用が回避されます。とにかく直接、STD libは賢いことをして、あなたのためにmemcpy/memmoveを呼び出すべきです:)

于 2012-05-13T17:03:59.003 に答える
0

使用するときは、バッファの適切なサイズを設定する必要があります。これは、現在利用可能なデータと、指定したサイズのまでのデータのみを入力するmemcpyためです。反対側であなたがやっているとしても(そして両方の場所で同じ価値を持っている)。 コードが意味をなす唯一のシナリオは、UDP()を使用していて、すべてのデータグラムのサイズがである場合です。recvrecvbufMAX_PACKETsend(sock,sendbuf,MAX_PACKET,0);MAX_PACKET
SOCK_DGRAMMAX_PACKET

于 2012-05-13T17:11:04.073 に答える
0

少なくともMAX_PACKETのサイズと同じバイト数のinbufferを宣言する必要がありますchar*inbuffer = new char [MAX_PACKET];

そして、各recv()memset(inbuffer、0、MAX_BUFFER);の前に配置します。2番目が1番目より短い2つのパケットを受信したシナリオで、前のパケットの末尾が誤って表示されないように、バッファをゼロにします。

着信パケットに一意の終了バイトがない場合、つまり'\ r'の場合は、intrecvbytesを追加する必要があります。recvbytes = new recv(...)recvはワイヤで受信したバイト数を返すため

于 2012-05-13T17:42:24.320 に答える