using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Net;
|
using System.Net.Sockets;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace RestartService.Monitor
|
{
|
public class UDPServer
|
{
|
private static Socket udpSocket;
|
|
/// <summary>
|
/// 启动Socket接收和发送功能
|
/// </summary>
|
/// <param name="port"></param>
|
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 { }
|
}
|
}
|
}
|