0

このMSDN の記事に基づいてクライアント サーバー ソケット システムを実装しようとしていますが、動作しています。これを行うと、サーバーがすぐに文字列を返すときに正常に動作します。

client.send();
client.receive();

問題は、送信メソッドが、ファイルの PDF バージョンの作成など、サーバーの処理に数分かかるものを要求した場合、受信呼び出しが直後に実行され、何も受信しないことです (サーバーがまだ何も送信していないため)。 PDF を処理します)。

サーバーが処理を終了してファイルを送信すると、受信メソッドが呼び出されるように、受信メソッドを実行する前にクライアントを一定時間待機させるにはどうすればよいですか?

4

2 に答える 2

2

これは、ブロッキング受信呼び出しと非ブロッキング受信呼び出しの違いのようです。ブロッキング受信呼び出しは、実際に受信するものがあるまで待機するか、タイムアウトになります。非ブロッキング受信呼び出しは、データが存在するかどうかにかかわらず、すぐに戻ります。これが何の呼び出しかはわかりませんが、C# には両方の種類の呼び出しがあることはわかっています。

あなたが提供したリンクは、一般的にあなたがやろうとしていることとは異なる非同期ソケットの例へのリンクでした。あなたがやろうとしていることは、同期スタイルに似ています。

ソケットに関して非同期とは、通常、データを受信したときに呼び出される関数を登録することを意味します。同期とは、ブロッキングまたは非ブロッキングの方法でポーリングする (明示的にデータを要求する) ことを意味します。

編集: データを送信し、何かを送信して何かを受信することを期待していることを示すクラス変数を設定します。次に、何かを受け取ったと言ってその変数がクリアされるのを待ちます。

sent = 1
client.send()
while(sent);

次に、実際に何かを取得したときの受信コールバックで、その変数を設定します。

/* receive data and process */
sent = 0;
于 2013-03-29T18:07:58.360 に答える
0

非同期を使用して待機します。関数は、呼び出しが返された後に呼び出されます。

http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

于 2013-03-29T18:15:43.733 に答える