3

私は C でソケット/ネットワーク プログラミングを学習しているだけで、recv()関数が予期しない動作を引き起こす状況に遭遇しました (少なくとも私にとっては予期しない)。

ソケットが設定されたサーバープログラムと、recv()そのような呼び出しがあります:

bytes_received = recv(connected, recv_data, 5, 0); 

recv_data5 バイトのバッファです。

クライアント プログラムはsend()データの送信に使用します。送信バッファーは 1024 バイトですが、標準入力から読み取っているため、この実験 (文字) では 1 ~ 10 バイトしか与えていません。

私のrecv()呼び出しが 5 バイトのバッファを使用し、5 バイトの制限を課している場合でも、5 バイト以上を送信でき、次回が呼び出されるように、サーバー側のどこかrecv()でキューに入れられているように見えます (たとえば、ループで)、受信データの次の 5 バイトを受信します。

私の理解では、それsend()はそのデータ(12バイトすべてとしましょう)を発射するということでしたがrecv()、5バイトを処理するように「設定」されているだけなので、最後の7バイトは失われます。サーバーはどこからこれらを取得していますか? recv()データをポップしているソケット レベルの基になる入力バッファはありますか?

4

1 に答える 1

4

(カーネル内の) ソケットの実装は、これを自動的に処理します。

TCP ソケットである限り、データを失うことはありません。UDP ソケットの場合、バッファがオーバーフローするとデータが失われる可能性があります。

于 2013-03-04T01:43:10.057 に答える