当前位置:  开发笔记 > 程序员 > 正文

UdpClient.CancelReceive在哪里?

如何解决《UdpClient.CancelReceive在哪里?》经验,为你挑选了1个好方法。

我正在实现一个简单的本地网络发现协议,所以我调用UdpClient.Send然后调用UdpClient.BeginReceive.如果有多个响应挂起,我会在回调结束时调用UdpClient.BeginReceive.像这样的东西:

UdpClient client = new UdpClient(AddressFamily.InterNetwork);
client.EnableBroadcast = true;
client.Send(request, request.Length, broadcastEndPoint);
client.BeginReceive(Callback, client);

......然后在Callback:

void Callback(IAsyncResult ar)
{
    UdpClient client = (UdpClient)ar.AsyncState;
    IPEndPoint remoteEndPoint = null;
    byte[] response = client.EndReceive(ar, ref remoteEndPoint);

    // Do something with response

    client.BeginReceive(Callback, client);
}

我的问题是我的主循环调用,client.Close而仍然有一个待处理的接收.接收完成,然后我对BeginReceive的下一次调用抛出异常:System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

为什么UdpClient没有CancelReceive方法?我该怎么做?



1> 小智..:

相反或要克服此异常创建bool并在发出close命令之前设置它,使用该bool检入回调

像这样

bool isClosing=false;
void Callback(IAsyncResult ar)
{
    if(isClosing) return;
}

bool isClosing发出close命令之前设置

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有