1,978
社区成员
发帖
与我相关
我的任务
分享
// System.Net.Sockets.UdpClient
[HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
public static Task<UdpReceiveResult> ReceiveAsync(this UdpClient client)
{
return Task<UdpReceiveResult>.Factory.FromAsync((AsyncCallback callback, object state) =>client.BeginReceive(callback, state), delegate(IAsyncResult ar)
{
IPEndPoint remoteEndPoint = null;
byte[] buffer = client .EndReceive(ar, ref remoteEndPoint);
return new UdpReceiveResult(buffer, remoteEndPoint);
}, null);
}
这是微软的源代码,net4.5下的异步udp接收代码。net4没有这方法,不过你可以直接像上面那样扩展方法使用了
ps:如果配合另外的东西做(rx for net),效果更爽
public static IObservable<UdpReceiveResult> ReceiveObservable(this UdpClient client)
{
return client.ReceiveAsync().ToObservable();
}
public static IObservable<int> SendObservable(this UdpClient client, byte[] msg, int bytes, string ip, int port)
{
return client.SendAsync(msg, bytes, ip, port).ToObservable();
}
public static IObservable<int> SendObservable(this UdpClient client, byte[] msg, int bytes, IPEndPoint endPoint)
{
return client.SendAsync(msg, bytes, endPoint).ToObservable();
}
public static IObservable<UdpReceiveResult> ReceiveStream(this UdpClient client)
{
return Observable.Defer(() => client.ReceiveObservable()).Repeat();
}