0

サーバーに接続し、バイナリデータの送信を開始し、送信が完了すると接続を閉じるクライアントがあります。接続が閉じられている場合、サーバーはクライアントがファイルの送信を完了したことを認識します。

接続を処理する単純な tcp クラスがあります。次に、データをサーバーに送信する別の関数があります。

  TcpC tcp = new TcpC();

  void send_data_to_server(){
        tcp.connect();

        while(read_data){
            tcp.sendData();
        }

        Thread.Sleep(500);
        tcp.disconnect();
  }

サーバーは非同期ソケットを使用し、クライアントが切断されたときに例外を取得する関数 WaitForData() を持っています。問題は、Thread.Sleep() を削除しても WaitForData は例外をキャッチしますが、onDataReceive はまだすべてのデータを受信して​​いません。これは、例外でバッファー サイズを確認し、Sleep() を使用する場合よりもはるかに小さいためです。

サーバーはこのような多くの操作を処理する必要があり、それを機能させるために Sleep() の「ハック」を使用する余裕はありません。とにかくうまくいかないこともあり、確実にスリープ間隔を数秒に設定する必要があります。サーバー側の他の非同期関数は、WaitForData() を除いて例外をトリガーしません。

接続をすぐに閉じてもすべてのデータを取得するにはどうすればよいですか? とにかくすべてのデータが送信された後に tcp.disconnect が呼び出されるので、なぜこの問題が発生するのかわかりません。ありがとう!

4

1 に答える 1

2

From the MSDN Docs:

To ensure that all data is sent and received before the socket is closed, you should call Shutdown before calling the Disconnect method.

It might be worth giving that a shot.

Otherwise if your code snippet is any indication (based on your use of TcpC), you should probably be using TcpClient.Close which I believe will do this for you.

于 2012-03-18T02:04:31.857 に答える