C#非同步UDP通訊

來源:互聯網
上載者:User

using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Net;<br />using System.Net.Sockets;<br />using System.Threading;<br />namespace AsyncServer<br />{<br /> public class UdpState<br /> {<br /> public UdpClient udpClient;<br /> public IPEndPoint ipEndPoint;<br /> public const int BufferSize = 1024;<br /> public byte[] buffer = new byte[BufferSize];<br /> public int counter = 0;<br /> }<br /> public class AsyncUdpSever<br /> {<br /> private IPEndPoint ipEndPoint = null;<br /> private IPEndPoint remoteEP = null;<br /> private UdpClient udpReceive = null;<br /> private UdpClient udpSend = null;<br /> private const int listenPort = 1100;<br /> private const int remotePort = 1101;<br /> UdpState udpReceiveState = null;<br /> UdpState udpSendState = null;<br /> private ManualResetEvent sendDone = new ManualResetEvent(false);<br /> private ManualResetEvent receiveDone = new ManualResetEvent(false);<br /> public AsyncUdpSever()<br /> {<br /> ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);<br /> remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);<br /> udpReceive = new UdpClient(ipEndPoint);<br /> udpSend = new UdpClient();<br /> udpReceiveState = new UdpState();<br /> udpReceiveState.udpClient = udpReceive;<br /> udpReceiveState.ipEndPoint = ipEndPoint;</p><p> udpSendState = new UdpState();<br /> udpSendState.udpClient = udpSend;<br /> udpSendState.ipEndPoint = remoteEP;<br /> }<br /> public void ReceiveMsg()<br /> {<br /> Console.WriteLine("listening for messages");<br /> while(true)<br /> {<br /> lock (this)<br /> {<br /> IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);<br /> receiveDone.WaitOne();<br /> Thread.Sleep(100);<br /> }<br /> }<br /> }<br /> private void ReceiveCallback(IAsyncResult iar)<br /> {<br /> UdpState udpReceiveState = iar.AsyncState as UdpState;<br /> if (iar.IsCompleted)<br /> {<br /> Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);<br /> string receiveString = Encoding.ASCII.GetString(receiveBytes);<br /> Console.WriteLine("Received: {0}", receiveString);<br /> //Thread.Sleep(100);<br /> receiveDone.Set();<br /> SendMsg();<br /> }<br /> }</p><p> private void SendMsg()<br /> {<br /> udpSend.Connect(udpSendState.ipEndPoint);<br /> udpSendState.udpClient = udpSend;<br /> udpSendState.counter ++;</p><p> string message = string.Format("第{0}個UDP請求處理完成!",udpSendState.counter);<br /> Byte[] sendBytes = Encoding.Unicode.GetBytes(message);<br /> udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);<br /> sendDone.WaitOne();<br /> }<br /> private void SendCallback(IAsyncResult iar)<br /> {<br /> UdpState udpState = iar.AsyncState as UdpState;<br /> Console.WriteLine("第{0}個請求處理完畢!", udpState.counter);<br /> Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));<br /> sendDone.Set();<br /> }</p><p> public static void Main()<br /> {<br /> AsyncUdpSever aus = new AsyncUdpSever();<br /> Thread t = new Thread(new ThreadStart(aus.ReceiveMsg));<br /> t.Start();<br /> Console.Read();<br /> }<br /> }<br />}<br />using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Net;<br />using System.Net.Sockets;<br />using System.Threading;<br />namespace AsyncClient<br />{<br /> public class UdpState<br /> {<br /> public UdpClient udpClient = null;<br /> public IPEndPoint ipEndPoint = null;<br /> public const int BufferSize = 1024;<br /> public byte[] buffer = new byte[BufferSize];<br /> public int counter = 0;<br /> }<br /> public class AsyncUdpClient<br /> {<br /> public static bool messageSent = false;<br /> // Receive a message and write it to the console.<br /> private const int listenPort = 1101;<br /> private const int remotePort = 1100;<br /> private IPEndPoint localEP = null;<br /> private IPEndPoint remoteEP = null;<br /> private UdpClient udpReceive = null;<br /> private UdpClient udpSend = null;<br /> private UdpState udpSendState = null;<br /> private UdpState udpReceiveState = null;<br /> private int counter = 0;<br /> private ManualResetEvent sendDone = new ManualResetEvent(false);<br /> private ManualResetEvent receiveDone = new ManualResetEvent(false);<br /> private Socket receiveSocket;<br /> private Socket sendSocket;<br /> public AsyncUdpClient()<br /> {<br /> localEP = new IPEndPoint(IPAddress.Any, listenPort);<br /> remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0],remotePort);<br /> udpReceive = new UdpClient(localEP);<br /> udpSend = new UdpClient();</p><p> udpSendState = new UdpState();<br /> udpSendState.ipEndPoint = remoteEP;<br /> udpSendState.udpClient = udpSend;</p><p> udpReceiveState = new UdpState();<br /> udpReceiveState.ipEndPoint = remoteEP;<br /> udpReceiveState.udpClient = udpReceive;</p><p> receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);<br /> receiveSocket.Bind(localEP);</p><p> sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);<br /> sendSocket.Bind(remoteEP);<br /> }<br /> public void SendMsg()<br /> {<br /> udpSend.Connect(remoteEP);</p><p> //Thread t = new Thread(new ThreadStart(ReceiveMessages));<br /> //t.Start();<br /> Byte[] sendBytes;<br /> string message;<br /> while (true)<br /> {<br /> message = "Client" + (counter++).ToString();<br /> lock (this)<br /> {<br /> sendBytes = Encoding.ASCII.GetBytes(message);<br /> udpSendState.counter = counter;<br /> udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);<br /> sendDone.WaitOne();<br /> Thread.Sleep(200);<br /> ReceiveMessages();<br /> }<br /> }<br /> }</p><p> public void SendCallback(IAsyncResult iar)<br /> {<br /> UdpState udpState = iar.AsyncState as UdpState;<br /> if (iar.IsCompleted)<br /> {<br /> Console.WriteLine("第{0}個發送完畢!", udpState.counter);<br /> Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));<br /> //if (udpState.counter == 10)<br /> //{<br /> // udpState.udpClient.Close();<br /> //}<br /> sendDone.Set();<br /> }<br /> }</p><p> public void ReceiveMessages()<br /> {<br /> lock (this)<br /> {<br /> udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);<br /> receiveDone.WaitOne();<br /> Thread.Sleep(100);<br /> }<br /> }<br /> public void ReceiveCallback(IAsyncResult iar)<br /> {<br /> UdpState udpState = iar.AsyncState as UdpState;<br /> if (iar.IsCompleted)<br /> {<br /> Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);<br /> string receiveString = Encoding.Unicode.GetString(receiveBytes);<br /> Console.WriteLine("Received: {0}", receiveString);<br /> receiveDone.Set();<br /> }<br /> }</p><p> public static void Main()<br /> {<br /> AsyncUdpClient auc = new AsyncUdpClient();<br /> auc.SendMsg();<br /> Console.Read();<br /> }<br /> }<br />}<br />

前天一個朋友讓我幫忙寫一個非同步UDP通訊的例子,於是參考了下MSDN修改了上面的代碼,比較醜陋,主要是看看啟動並執行功能。

後來準備把裡面的UdpClient換成Socket來實現,但是碰到了個問題。但列文章寫出來,共同探討探討。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.