C#UdpClient不从EndReceive返回

时间:2013-12-19 14:12:14

标签: c# udpclient

我正在使用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;
}

我简化了程序,只显示可能相关的部分。 如果有人能帮助我,我会感激不尽。

此致 扬

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果异步操作尚未完成,

EndReceive将阻止。

我认为receiveClient中的ReceiveCallback是与receiveClient一起使用的另一个BeginReceive。因此,请确保使用相同的实例。