【问题标题】:C# UdpClient does not return from EndReceiveC# UdpClient 不从 EndReceive 返回
【发布时间】:2013-12-19 14:12:14
【问题描述】:

我正在使用 c# UdpClient 通过 udp 接收数据。一切正常,但一段时间后,receiveClient 方法没有返回。

首先我认为这是一个同步问题,所以我用锁封闭了共享资源(lastPackage),但这没有帮助。

我调试了程序(这很困难,由于异步接收),最后发现方法 endReceive 没有返回。 udp 源会继续发送包。

下面我已经打印了相关的程序部分。

public class UDPSocket {

private IPEndPoint receiveEndPoint;
private UdpClient receiveClient;

private byte[] lastPackage;

private bool unhandledPackage;//shared resource

private Dictionary<string, string> agentsMap;

public UDPSocket(string sendIp, int sendPort, int receivePort){     

    receiveEndPoint = new IPEndPoint (IPAddress.Any, receivePort);
    receiveClient = new UdpClient (receiveEndPoint);
    singleton.receiveClient.BeginReceive(new AsyncCallback(singleton.ReceiveCallback), null);

    unhandledPackage = false;

    agentsMap = new Dictionary<string, string> ();
}

public void Update () {//is called once per second

    if (unhandledPackage) {
        string rawString = Encoding.UTF8.GetString(lastPackage);
        agentsMap = Parser.parseString(rawString);

        unhandledPackage = false;
        receiveClient.BeginReceive(new AsyncCallback(ReceiveCallback), null);
    }
}

public string getEmotion(string id){

    string emotion;
    if(!agentsMap.TryGetValue(id, out emotion)){
        return "No connection";
    }
    return emotion;
}

public void OnDestroy()
{
    if (receiveClient != null) {
        receiveClient.Close ();
    }
}

public void ReceiveCallback(IAsyncResult ar)
{
    lastPackage = receiveClient.EndReceive(ar, ref receiveEndPoint);//DOES NOT RETURN FROM THIS METHOD CALL
    unhandledPackage = true;
}

我已简化程序以仅显示可能相关的部分。 如果有人可以帮助我,我将不胜感激。

问候, 一月

【问题讨论】:

  • 什么是singleton.receiveClient

标签: c# udpclient


【解决方案1】:

如果您使用的是 .net 4.5,只需使用 async&await 关键字,这样:

    private static async void Foo(int port)
    {
        UdpClient udpClient=new UdpClient(port);
        UdpReceiveResult result = await udpClient.ReceiveAsync();
    }

【讨论】:

    【解决方案2】:

    如果异步操作尚未完成,EndReceive 将阻塞。

    我假设ReceiveCallback 中的receiveClient 是另一个receiveClient,因为它与BeginReceive 一起使用。所以请确保使用相同的实例。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多