- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- namespace AsyncServer
- {
- public class UdpState
- {
- public UdpClient udpClient;
- public IPEndPoint ipEndPoint;
- public const int BufferSize = 1024;
- public byte[] buffer = new byte[BufferSize];
- public int counter = 0;
- }
- public class AsyncUdpSever
- {
- private IPEndPoint ipEndPoint = null;
- private IPEndPoint remoteEP = null;
- private UdpClient udpReceive = null;
- private UdpClient udpSend = null;
- private const int listenPort = 1100;
- private const int remotePort = 1101;
- UdpState udpReceiveState = null;
- UdpState udpSendState = null;
- private ManualResetEvent sendDone = new ManualResetEvent(false);
- private ManualResetEvent receiveDone = new ManualResetEvent(false);
- public AsyncUdpSever()
- {
- ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);
- remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);
- udpReceive = new UdpClient(ipEndPoint);
- udpSend = new UdpClient();
- udpReceiveState = new UdpState();
- udpReceiveState.udpClient = udpReceive;
- udpReceiveState.ipEndPoint = ipEndPoint;
- udpSendState = new UdpState();
- udpSendState.udpClient = udpSend;
- udpSendState.ipEndPoint = remoteEP;
- }
- public void ReceiveMsg()
- {
- Console.WriteLine("listening for messages");
- while(true)
- {
- lock (this)
- {
- IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);
- receiveDone.WaitOne();
- Thread.Sleep(100);
- }
- }
- }
- private void ReceiveCallback(IAsyncResult iar)
- {
- UdpState udpReceiveState = iar.AsyncState as UdpState;
- if (iar.IsCompleted)
- {
- Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);
- string receiveString = Encoding.ASCII.GetString(receiveBytes);
- Console.WriteLine("Received: {0}", receiveString);
- //Thread.Sleep(100);
- receiveDone.Set();
- SendMsg();
- }
- }
- private void SendMsg()
- {
- udpSend.Connect(udpSendState.ipEndPoint);
- udpSendState.udpClient = udpSend;
- udpSendState.counter ++;
- string message = string.Format("第{0}个UDP请求处理完成!",udpSendState.counter);
- Byte[] sendBytes = Encoding.Unicode.GetBytes(message);
- udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);
- sendDone.WaitOne();
- }
- private void SendCallback(IAsyncResult iar)
- {
- UdpState udpState = iar.AsyncState as UdpState;
- Console.WriteLine("第{0}个请求处理完毕!", udpState.counter);
- Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));
- sendDone.Set();
- }
- public static void Main()
- {
- AsyncUdpSever aus = new AsyncUdpSever();
- Thread t = new Thread(new ThreadStart(aus.ReceiveMsg));
- t.Start();
- Console.Read();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- namespace AsyncClient
- {
- public class UdpState
- {
- public UdpClient udpClient = null;
- public IPEndPoint ipEndPoint = null;
- public const int BufferSize = 1024;
- public byte[] buffer = new byte[BufferSize];
- public int counter = 0;
- }
- public class AsyncUdpClient
- {
- public static bool messageSent = false;
- // Receive a message and write it to the console.
- private const int listenPort = 1101;
- private const int remotePort = 1100;
- private IPEndPoint localEP = null;
- private IPEndPoint remoteEP = null;
- private UdpClient udpReceive = null;
- private UdpClient udpSend = null;
- private UdpState udpSendState = null;
- private UdpState udpReceiveState = null;
- private int counter = 0;
- private ManualResetEvent sendDone = new ManualResetEvent(false);
- private ManualResetEvent receiveDone = new ManualResetEvent(false);
- private Socket receiveSocket;
- private Socket sendSocket;
- public AsyncUdpClient()
- {
- localEP = new IPEndPoint(IPAddress.Any, listenPort);
- remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0],remotePort);
- udpReceive = new UdpClient(localEP);
- udpSend = new UdpClient();
- udpSendState = new UdpState();
- udpSendState.ipEndPoint = remoteEP;
- udpSendState.udpClient = udpSend;
- udpReceiveState = new UdpState();
- udpReceiveState.ipEndPoint = remoteEP;
- udpReceiveState.udpClient = udpReceive;
- receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- receiveSocket.Bind(localEP);
- sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- sendSocket.Bind(remoteEP);
- }
- public void SendMsg()
- {
- udpSend.Connect(remoteEP);
- //Thread t = new Thread(new ThreadStart(ReceiveMessages));
- //t.Start();
- Byte[] sendBytes;
- string message;
- while (true)
- {
- message = "Client" + (counter++).ToString();
- lock (this)
- {
- sendBytes = Encoding.ASCII.GetBytes(message);
- udpSendState.counter = counter;
- udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);
- sendDone.WaitOne();
- Thread.Sleep(200);
- ReceiveMessages();
- }
- }
- }
- public void SendCallback(IAsyncResult iar)
- {
- UdpState udpState = iar.AsyncState as UdpState;
- if (iar.IsCompleted)
- {
- Console.WriteLine("第{0}个发送完毕!", udpState.counter);
- Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));
- //if (udpState.counter == 10)
- //{
- // udpState.udpClient.Close();
- //}
- sendDone.Set();
- }
- }
- public void ReceiveMessages()
- {
- lock (this)
- {
- udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);
- receiveDone.WaitOne();
- Thread.Sleep(100);
- }
- }
- public void ReceiveCallback(IAsyncResult iar)
- {
- UdpState udpState = iar.AsyncState as UdpState;
- if (iar.IsCompleted)
- {
- Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);
- string receiveString = Encoding.Unicode.GetString(receiveBytes);
- Console.WriteLine("Received: {0}", receiveString);
- receiveDone.Set();
- }
- }
- public static void Main()
- {
- AsyncUdpClient auc = new AsyncUdpClient();
- auc.SendMsg();
- Console.Read();
- }
- }
- }
前天一个朋友让我帮忙写一个异步UDP通信的例子,于是参考了下MSDN修改了上面的代码,比较丑陋,主要是看看运行的功能。
后来准备把里面的UdpClient换成Socket来实现,但是碰到了个问题。但列文章写出来,共同探讨探讨。