私は C でソケット/ネットワーク プログラミングを学習しているだけで、recv()
関数が予期しない動作を引き起こす状況に遭遇しました (少なくとも私にとっては予期しない)。
ソケットが設定されたサーバープログラムと、recv()
そのような呼び出しがあります:
bytes_received = recv(connected, recv_data, 5, 0);
recv_data
5 バイトのバッファです。
クライアント プログラムはsend()
データの送信に使用します。送信バッファーは 1024 バイトですが、標準入力から読み取っているため、この実験 (文字) では 1 ~ 10 バイトしか与えていません。
私のrecv()
呼び出しが 5 バイトのバッファを使用し、5 バイトの制限を課している場合でも、5 バイト以上を送信でき、次回が呼び出されるように、サーバー側のどこかrecv()
でキューに入れられているように見えます (たとえば、ループで)、受信データの次の 5 バイトを受信します。
私の理解では、それsend()
はそのデータ(12バイトすべてとしましょう)を発射するということでしたがrecv()
、5バイトを処理するように「設定」されているだけなので、最後の7バイトは失われます。サーバーはどこからこれらを取得していますか? recv()
データをポップしているソケット レベルの基になる入力バッファはありますか?