亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#Udp BeginReceive-消息混亂

C#Udp BeginReceive-消息混亂

C#
冉冉說 2021-05-14 18:19:07
我目前正在嘗試創建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個贊

我將整個實現更改為.ReceiveTask而不是中使用.BeginReceive。我發現使用aTask會更好,因為我需要安全地停止并啟動接收功能,并且它解決了我遇到的怪異問題。


查看完整回答
反對 回復 2021-05-23
  • 1 回答
  • 0 關注
  • 312 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號