0

クライアントサーバーアプリケーションがあります。サーバーは複数のクライアントからの接続を受け入れます。

クライアントがサーバーに接続された後、クライアントはサーバーにコマンドを送信し、サーバーは応答を送信します。応答は文字列またはファイルのいずれかです。

接続を受け入れた後のサーバー側には、クライアントとの通信を担当するソケット(リスニングソケットとは別)があります。

クライアント側で、クライアントがサーバーにコマンドを送信した後、同じソケットで応答の読み取りを開始します。

今私の問題はファイルにあります、

クライアントがサーバーにコマンドを送信してファイルを要求すると、サーバーはファイルのバイナリデータを送信して応答を開始します。ファイルがすべて正常であれば、正常に転送されますが、ファイル転送の途中でサーバー側で読み取りの問題が発生した場合は、これは1対1のソケット通信であるため、この問題をクライアントに通知する方法はありません...クライアントは、最初に送信されたファイルサイズが完全でなくなるまで、受信データをファイルデータであるかのように扱います。

これは繰り返し発生するパターンである可能性があると確信しています。これを解決するにはどうすればよいですか?

4

2 に答える 2

0

FTPは、コマンド接続とデータ接続の2つの接続を使用してこれを実行します。

于 2012-07-13T12:37:54.993 に答える
0

これらがTCP/IPソケットである限り、必要なのは、サーバーとクライアントの間で、最初の8バイト(たとえば)sent()とrecv()がそれぞれバイナリデータのサイズを表すという合意だけです。従う。TCP / IPは、すべてのピースが到着し、適切に処理されていることを確認します。転送できるさまざまなファイルがある場合は、その後の4バイトがファイルタイプの文字を表すことに同意するものとします。したがって、基本的には、12バイトになるまでrecv()を実行し続けます。これには、おそらく1つのrecv()しか必要ありません。次に、受信する予定のすべてのバイトが得られるまで、recv()を使用し続けます。

于 2014-04-22T19:56:09.210 に答える