12

私はソケットプログラミングを学んでおり、次の機能があります。

public void OnDataReceived(IAsyncResult asyn)

これがコールバックの設定方法です。

pfnWorkerCallBack = new AsyncCallback(OnDataReceived);

問題は、別の引数を OnDataReceived コールバック関数に渡す必要があることです。これを行うにはどうすればよいですか? シンプルな tcp サーバーを作成しようとしていますが、データがどのクライアントから来ているかを追跡する必要があります。任意のヒント?ありがとう!

4

4 に答える 4

10

ここを使用していると推測しますSystem.Net.Sockets.SocketBeginReceiveのオーバーロードを見ると、objectパラメーター (名前付きの状態) が表示されます。AsyncCallbackこのパラメーターとして任意の値を渡すことができ、コールバックに流れます。その後、コールバックに渡されたオブジェクトのAsyncStateプロパティを使用してアクセスできます。IAsyncResult例えば;

public void SomeMethod() {
  int myImportantVariable = 5;
  System.Net.Sockets.Socket s;
  s.BeginReceive(buffer, offset, size, SocketFlags.None, new new AsyncCallback(OnDataReceived), myImportantVariable);
}

private void OnDataReceived(IAsyncResult result) {
  Console.WriteLine("My Important Variable was: {0}", result.AsyncState); // Prints 5
}
于 2012-02-08T11:46:33.690 に答える
3

これは、匿名の代理人で解決したい問題です。

var someDataIdLikeToKeep = new object();
mySocket.BeginBlaBla(some, other, ar => {
        mySocket.EndBlaBla(ar);
        CallSomeFunc(someDataIdLikeToKeep);
    }, null) //no longer passing state as we captured what we need in callback closure

これにより、受信関数で状態オブジェクトをキャストする必要がなくなります。

于 2012-02-08T11:52:51.693 に答える
2

を呼び出すとき、最後のパラメーターとしてBeginReceiveany を渡すことができます。のプロパティobjectを介して、コールバックで同じオブジェクトを使用できるようになります。IAsyncResultAsyncState

于 2012-02-08T11:48:22.873 に答える