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 { }
}
}
}