我正在学习socket编程,我有以下函数:
public void OnDataReceived(IAsyncResult asyn)
这是回调函数的设置方式:
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
我的问题是我需要向OnDataReceived回调函数传递另一个参数,我该如何做?我正在尝试制作一个简单的TCP服务器,我需要跟踪数据来自哪个客户端。有什么提示吗?谢谢!
我正在学习socket编程,我有以下函数:
public void OnDataReceived(IAsyncResult asyn)
这是回调函数的设置方式:
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
我的问题是我需要向OnDataReceived回调函数传递另一个参数,我该如何做?我正在尝试制作一个简单的TCP服务器,我需要跟踪数据来自哪个客户端。有什么提示吗?谢谢!
我假设您在这里使用System.Net.Sockets.Socket
。 如果查看BeginReceive的重载,您会看到object
参数(命名为state)。 您可以将任意值作为此参数传递,它将流经到您的AsyncCallback
回调。 然后,您可以使用传递到回调中的IAsyncResult
对象的AsyncState
属性来访问它。例如:
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
}
public class Foo { public int Bar {get;set;} public string Baz {get;set;} }
然后将该实例传递到 BeginReceive
方法中,并将 result.AsyncState
强制转换回该类型。 - MrMDavidson我更喜欢使用匿名委托来解决这个问题:
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
它可以避免在接收函数中强制转换状态对象。
BeginReceive
时,您可以将任何object
作为其最后一个参数传递。通过IAsyncResult
的AsyncState
属性,相同的对象将可用于您的回调函数。请注意保留HTML标签格式。BeginReceive
的重载方法,你会看到有一个名为state的对象参数。state
参数,然后在回调方法中处理它们。client.BeginConnect(ipEndPoint, new AsyncCallback(ConnectedCallback), new object[] { parameter1, parameter2});