我目前正在嘗試創建UDP客戶端/服務器。這很簡單,有一個發送函數,它發送一個字節,然后客戶端立即響應一條消息,其中包含我正在偵聽的信息我在接收數據時遇到了麻煩。我一直都在接收數據,并且收到的包裹確實有正確的長度,但是消息似乎混亂了。SendAndReceive函數在10秒計時器上。編輯:如果我每次調用SendAndReceive函數時都重新創建MyUdpClient,則它將正常工作,并且程序包的順序不正確。這是我的代碼:private void SendAndReceive(object sender = null, ElapsedEventArgs e = null){ ClientEndpoint = new IPEndPoint(IPAddress.Parse(IP), Port); // Works if i recreate MyUdpClient... MyUdpClient = new UdpClient(); MyUdpClient.ExclusiveAddressUse = false; MyUdpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); MyUdpClient.Send(InfoPacket, InfoPacket.Length, ClientEndpoint); try { MyUdpClient.BeginReceive(new AsyncCallback(ReceiveMessages), null); } catch (Exception exception) { Console.WriteLine($"Exception: {exception.ToString()}"); }}public void ReceiveMessages(IAsyncResult res){ IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, Port); byte[] receivedPacket = MyUdpClient.EndReceive(res, ref RemoteIpEndPoint); var ipAddress = RemoteIpEndPoint.Address.ToString(); MyUdpClient.BeginReceive(new AsyncCallback(ReceiveMessages), null); // This is for debugging. string receivedTime = DateTime.Now.ToString("HH:mm:ss"); Console.WriteLine($"[{receivedTime}]{ipAddress} {receivedPacket.Length} {Encoding.Default.GetString(receivedPacket)}"); // Process Data Further ...}常見的輸出通常是這樣的:[18.29.30]172.20.55.32 475 a[18.29.30]172.20.55.10 455 b[18.29.30]172.20.55.101 440 c[18.29.30]172.20.55.17 452 d[18.29.30]172.20.55.31 414 e[18.29.30]172.20.55.20 449 f[18.29.30]172.20.55.8 456 g[18.29.30]172.20.55.28 381 h字母代表解碼后的消息。第一次接收到這些消息時,它們是正確的,但是此后,消息就混亂了。有任何想法嗎?我不確定該朝哪個方向走。是線程問題,還是我必須在以后解碼接收到的包?
1 回答

呼啦一陣風
TA貢獻1802條經驗 獲得超6個贊
我將整個實現更改為.Receive
在Task
而不是中使用.BeginReceive
。我發現使用aTask
會更好,因為我需要安全地停止并啟動接收功能,并且它解決了我遇到的怪異問題。
- 1 回答
- 0 關注
- 312 瀏覽
添加回答
舉報
0/150
提交
取消