サーバーに接続し、バイナリデータの送信を開始し、送信が完了すると接続を閉じるクライアントがあります。接続が閉じられている場合、サーバーはクライアントがファイルの送信を完了したことを認識します。
接続を処理する単純な 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 が呼び出されるので、なぜこの問題が発生するのかわかりません。ありがとう!