1

winsockのrecv-functionについて一般的な質問があります。クライアント/サーバーアーキテクチャを使用してプログラムを作成します。このプログラムでは、クライアントがカメライメージをサーバーに送信し、サーバーが別のイメージをクライアントに送り返します。プログラムが閉じられるまで、クライアントはいくつかの画像を送信します。また、サーバーは受信したすべての画像を他の画像で応答します。

クライアント(送信)---->サーバー(受信)---->サーバー(送信)---->クライアント(受信)。^ _ __ _ __ _ __ _ ____ LOOP _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _ |

私の問題は、サーバーが機能を受け取ることです。512バイトの大きなバッファを使用してreceive関数を数回呼び出すと、画像全体を受信したことをどのようにして知ることができますか?私が見つけた例は、接続が閉じられるまで待つだけです(recvは0を返します)が、接続を閉じずにいくつかの画像を受信したいと思います。しかし、バッファにバイトがなくなるまで受信すると、recv関数は新しいバイトができるまでスレッドを停止します(ただし、サーバーが受信する前に最初に独自のイメージをクライアントに送り返したいため、これは発生しません。次のもの)。

では、次のバイトや接続が閉じられるのを待たずに、サーバーが独自のイメージをクライアントに送り返すことができるように、イメージ全体が受信されたことをサーバーに通知する可能性はありますか?

4

2 に答える 2

4

受信者が期待するデータ量のサイズを含むヘッダーを持つプロトコルを開発します。受信者は、TCP ストリームからヘッダー PLUS バイト (ヘッダーによって示される)nのみを読み取ります。nその後、次のヘッダーが期待できます。これらのバイトを受信しない場合n、送信は不完全です。

つまり、次のようにプロトコルでメッセージを定義できます。

メッセージ:

  • データ長 (32 ビット、unsigned int)
  • データ内容
于 2010-09-28T13:41:04.913 に答える
1

で構成されるパケットで画像データをラップします。

  • 続くバイト数を示す固定サイズのヘッダー
  • 実際の画像データ

受信コードでは、最初にヘッダー部分を読み取り、適切な量のデータを読み取ります。

エラー チェックを省略したサンプル コード。また、データがバラバラに到着する可能性があるため、実際の recv 呼び出しを常にループする必要があります。

unsigned bytesExpected;
Image imgData;
while( !LoopMustStop )
{
  Read( sizeof( unsigned ), bytesExpected );
  Read( bytesExpected, imgData );
  Process( bytesExpected, imgData )
}
于 2010-09-28T13:44:02.397 に答える