2012-03-29 6 views
0
  1. クライアント側では、常に完全な応答が得られるか、応答の半分をあるソートで残りの半分を別のソートで取得する可能性があります(たとえば、 recv()API用に定義されています)。
  2. recv()APIで埋め込まれた2つの応答を受け取る可能性はありますか?

答えて

1

ゼロから任意のサイズのデータ​​を取得できます。実際に受信したデータ量を確認するには、常に戻り値を確認してください。

あなたの質問にお答えしてください:あなたは完全な「応答」よりも少なくても、完全な「応答」より多くを得ることができます。 2つ以上の完全な応答メッセージを受け取った場合、2つ、または1つ半のメッセージ、または複数のメッセージを受信する可能性があります。

3

TCPはメッセージの境界を保持しません。それが公開するのはバイトストリームです。したがって、片側で呼び出すsend()は、相手側のrecv()に対応していない可能性があります。たとえば、以下のことが起こるかもしれない:

  • コールが再度100バイトで)(送信コール、100バイト()で送信
  • Bは、(RECVを呼び出し)となる200バイト(Nagle's algorithm参照)

あるいは、逆:

  • コールが(送信)1のMIB
  • とBは、(RECVを呼び出し)、次いで(RECVを呼び出し、512 KiBのを取得し)、再度、取得512 KiB(バッファスペースは受信側または送信側で不十分でした)。あなたの「パディング」という質問については

、ないあなたがたrecvの戻り値をチェックするを持っていることを()実際にあなたのバッファに何バイトを返された場所を確認します。 [6バイト:データサイズヘッダ]

0

この方法を送信するために渡されたデータ・ブロックを形成することができる[データ]を

そして各反復に1つのバイトを読み取るループ内のrecv()を呼び出します。 'データサイズヘッダー'(最初の6バイト)を読み取り、望ましいサイズのバッファーを割り当て、残りのバイトを読み取ります。