using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading.Tasks; using System.Net.Sockets; namespace HDLMonitorService.UDP { public class UDPServer { private static Socket udpSocket; /// /// 启动Socket接收和发送功能 /// /// public static void Start() { if (IsRunning) { return; } udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSocket.Bind(new IPEndPoint(IPAddress.Any, 0)); asyncBeginReceive(); } public static void Close() { if (!IsRunning) { return; } udpSocket.Close(); udpSocket = null; System.Threading.Thread.Sleep(100); } private static bool IsRunning { get { return null == udpSocket ? false : true; } } private static void asyncBeginReceive() { if (!IsRunning) { return; } try { var tempPacket = new Packet { }; udpSocket.BeginReceiveFrom(tempPacket.Bytes, 0, tempPacket.Bytes.Length, SocketFlags.None, ref tempPacket.RemoteEndPoint, new AsyncCallback(asyncEndReceive), tempPacket); } catch { System.Threading.Thread.Sleep(1); asyncBeginReceive(); } } private static void asyncEndReceive(IAsyncResult iar) { if (!IsRunning) { return; } try { var tempPacket = (Packet)iar.AsyncState; var len = udpSocket.EndReceiveFrom(iar, ref tempPacket.RemoteEndPoint); var bytes = new byte[len]; System.Array.Copy(tempPacket.Bytes, 0, bytes, 0, bytes.Length); tempPacket.Bytes = bytes; asyncBeginReceive(); tempPacket.Manager(); } catch { asyncBeginReceive(); } } public static void AsyncBeginSend(Packet tempPacket) { try { udpSocket.BeginSendTo(tempPacket.Bytes, 0, tempPacket.Bytes.Length, SocketFlags.None, tempPacket.RemoteEndPoint, new AsyncCallback(asyncEndSend), tempPacket); } catch { } } private static void asyncEndSend(IAsyncResult iar) { try { int bytesSent = udpSocket.EndSendTo(iar); } catch { } } } }