我正在使用c#UdpClient通過udp接收數據。一切正常,但過了一段時間receiveClient方法不返回。C#UdpClient不會從EndReceive返回
首先,我認爲這是一個同步問題,所以我用共享資源(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'? – JeffRSon