C# UdpClient使用Receive和BeginReceive接收消息時的不同寫法


使用Receive(同步阻塞方式), 注意使用同步方法時,需要使用線程來開始方法,不然會使UI界面卡死

IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858);
            UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
            while (true) //由於Receive方法是阻塞方法,一個Receive操作完了后才能繼續往下執行,所以能在這里使用死循環
            {
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string msg = Encoding.UTF8.GetString(receiveBytes);
            }

使用BeginReceive(異步)

private static void InitializeUdpClient()
              {               
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858);
                UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
                //如果這里寫while(true) 則會不停掛起異步接收操作,直到占滿緩沖區間或隊列。會報“由於系統緩沖區空間不足或隊列已滿,不能執行套接字上的操作”的錯
                UdpState s = new UdpState(udpClient, RemoteIpEndPoint);
                udpClient.BeginReceive(EndReceive, s);
              }


        private static void EndReceive(IAsyncResult ar)
        {
            try
            {
                UdpState s = ar.AsyncState as UdpState;
                if (s != null)
                {
                    UdpClient udpClient = s.UdpClient;

                    IPEndPoint ip = s.IP;
                    Byte[] receiveBytes = udpClient.EndReceive(ar, ref ip);
                    string msg = Encoding.UTF8.GetString(receiveBytes);
                   
                    udpClient.BeginReceive(EndReceive, s);//在這里重新開始一個異步接收,用於處理下一個網絡請求
                }
            }
            catch (Exception ex)
            {
                //處理異常
            }
        }

    public class UdpState
    {
        private UdpClient udpclient = null;

        public UdpClient UdpClient
        {
            get { return udpclient; }
        }

        private IPEndPoint ip;

        public IPEndPoint IP
        {
            get { return ip; }
        }

        public UdpState(UdpClient udpclient, IPEndPoint ip)
        {
            this.udpclient = udpclient;
            this.ip = ip;
        }
    }

文章轉至網絡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM