受信したデータをコピーrecv()
します。最大サイズは、入出力バッファーのMAX_PACKETです。
固定サイズでコピーしても大丈夫MAX_PACKET
ですか?memcpyを使用する場合、バッファの適切なサイズを設定する必要がありますか?
recv(sock,recvbuf,MAX_PACKET,0);
memcpy(inbuffer,recvbuf,MAX_PACKET);
はい、安全ですが無駄です。また、recvbufから実際に受信したデータ以外に、バッファに返されたデータを使用しないことを忘れないでください。
inBufferが少なくともMAX_PACKETと同じ大きさでない限り、そうではありません。
Oezbekが言ったことに加えて、recvは、実際に0を受け取らない限り、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を呼び出すべきです:)
使用するときは、バッファの適切なサイズを設定する必要があります。これは、現在利用可能なデータと、指定したサイズのまでのデータのみを入力するmemcpy
ためです。反対側であなたがやっているとしても(そして両方の場所で同じ価値を持っている)。
コードが意味をなす唯一のシナリオは、UDP()を使用していて、すべてのデータグラムのサイズがである場合です。recv
recvbuf
MAX_PACKET
send(sock,sendbuf,MAX_PACKET,0);
MAX_PACKET
SOCK_DGRAM
MAX_PACKET
少なくともMAX_PACKETのサイズと同じバイト数のinbufferを宣言する必要がありますchar*inbuffer = new char [MAX_PACKET];
そして、各recv()memset(inbuffer、0、MAX_BUFFER);の前に配置します。2番目が1番目より短い2つのパケットを受信したシナリオで、前のパケットの末尾が誤って表示されないように、バッファをゼロにします。
着信パケットに一意の終了バイトがない場合、つまり'\ r'の場合は、intrecvbytesを追加する必要があります。recvbytes = new recv(...)recvはワイヤで受信したバイト数を返すため