【发布时间】: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?