1

.net の非同期ソケット通信モデルを理解するのに少し悪夢を見ています。ReadCallBackメソッドがいつ呼び出されるのか教えてください(私はポートをリッスンするために非同期サーバーを使用しています)(必要に応じて完全なコードについてはMSリンクが下にあります)

//handler is my server socket handler
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize,
 0,new AsyncCallback(ReadCallback), state);

つまり、データの受信が*終了*したとき、または何らかのデータが入ってくることを*検出*したときです。データが到着し続ける場合、ReadCallBack は引き続き呼び出されますか? クライアントが "\n" デリミタのようなものを送信しているわけではないので、readcallback メソッドで何を送信しているのかを確認するにはどうすればよいですか? 私のクライアントは、最初の接続時に単一の「hello_My name is」メッセージを除いて、実際に10秒ごとにping(iAmAlive ping)を送信しています。

ありがとう

これは、 Microsoft Async Server ソケットの例を理解しようとしている例です

4

3 に答える 3

2

コールバックは、あなたが指示した場合、もはやデータが到着していないことを認識しています。状態オブジェクトでそれを行うことができます。メソッドでリンクした例を確認するReadCallback()と、状態オブジェクトの sb プロパティが調べられます (つまり、受信した文字列)。含まれている場合は、フォールスルーし、バックグラウンド"<EOF>"で呼び出してコールバックを終了します。EndInvokesb が含まれていない限り"<EOF>"、コールバックは読み取りを試み続けます。

于 2013-03-11T12:18:08.830 に答える
2

呼び出しているメソッドは次のように定義されています。

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginReceive(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)

渡す AsyncCallback(ReadCallback) パラメーターはメソッドへのデリゲートポインターであり、受信操作の完了時に送信者が呼び出す必要があります。

callback
Type: System.AsyncCallback
An AsyncCallback delegate that references the method to invoke when the operation is complete.

私は、ソケット通信を単一チャネル内の一連のメッセージと考えています。

そのコールバック メソッドが呼び出されているため、Readcallback は特定のメッセージ データの最後にあることを「認識」します。つまり、特定のメッセージのすべてのデータのポスト転送と呼ばれます。

受信したデータを調査し、そこに EOF など、考案したプロトコルに従ってすべてのメッセージの終了マーカーが含まれている場合は、接続も閉じる必要があります。

また、状態オブジェクトに追加のコンテキストを入れることもできます (そしてキャストを使用してそれを型付けすることもできます)。これは // コールバック メソッドで参照できます。

したがって、クライアントが「知っている」ことは、あなたが工夫することに帰着します。これは、生のソケットを使用する利点の 1 つです。プロトコルを工夫すれば、好きなだけシンプルにすることも洗練させることもできます。他の誰かがプロトコルを決定した場合は、そのドキュメントを取得するか、別の方法で質問します。

プロトコルの例では、「EOF」はファイル/転送の終わりを意味します。必要に応じて簡単に「バナナ」にすることができ、メッセージで「バナナ」を探し、見つかった場合はチャネルを閉じます。

于 2013-03-11T12:21:40.493 に答える
1

MSDNで述べられているように、非同期メソッドが終了するとすぐに、この特定のコールバックが呼び出されます。
よくわからない場合は、ドキュメントを読む必要があります (もちろん、利用可能な場合は、MSDN で多くの情報が提供されています)。

于 2013-03-11T11:56:18.163 に答える