You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
2.8 KiB

using JiLinApp.Docking.VibrateAlarm;
using System.ComponentModel;
1 year ago
using System.Net;
using System.Net.Sockets;
namespace JiLinApp.Docking.FenceAlarm;
public class UdpServer
1 year ago
{
#region Fields
1 year ago
/// <summary>
/// 用于UDP接收的网络服务类
1 year ago
/// </summary>
private UdpClient RecvUdp { get; }
1 year ago
/// <summary>
/// 用于UDP发送的网络服务类
1 year ago
/// </summary>
private UdpClient SendUdp { get; }
private BackgroundWorker Worker { get; }
#region Properties
public string RecvIp { get; private set; }
public int RecvPort { get; private set; }
#endregion Properties
#endregion Fields
1 year ago
#region Ctors
1 year ago
public UdpServer(int port) : this("0.0.0.0", port)
{
}
1 year ago
public UdpServer(string ip, int port)
1 year ago
{
RecvIp = ip;
RecvPort = port;
RecvUdp = new(new IPEndPoint(IPAddress.Parse(ip), port));
SendUdp = new(new IPEndPoint(IPAddress.Any, 0));
Worker = new()
{
WorkerSupportsCancellation = true
};
Worker.DoWork += Back_DoWork;
1 year ago
}
~UdpServer()
1 year ago
{
Stop();
}
#endregion Ctors
#region Server
public void Start()
{
if (IsRunning()) return;
Worker.RunWorkerAsync();
}
1 year ago
public void Stop()
{
if (!IsRunning()) return;
Worker.CancelAsync();
RecvUdp.Close();
SendUdp.Close();
1 year ago
}
public bool IsRunning()
{
return Worker != null && Worker.IsBusy;
}
#endregion Server
#region Events
public event EventHandler<UdpDatagramReceivedEventArgs<byte[]>>? DatagramReceived;
private void RaiseDatagramReceived(IPEndPoint ipep, byte[] datagram)
1 year ago
{
DatagramReceived?.Invoke(this, new UdpDatagramReceivedEventArgs<byte[]>(ipep, datagram));
}
#endregion Events
#region Receive
private void Back_DoWork(object? sender, DoWorkEventArgs e)
{
IPEndPoint remoteIpep = new(IPAddress.Any, 0);
while (Worker != null && !Worker.CancellationPending)
{
try
{
byte[] bytRecv = RecvUdp.Receive(ref remoteIpep);
RaiseDatagramReceived(remoteIpep, bytRecv);
}
catch
{
}
}
1 year ago
}
#endregion Receive
#region Send
public bool SendMessage(string ip, int port, byte[] msg)
{
IPEndPoint ipep = new(IPAddress.Parse(ip), port);
int result = SendUdp.Send(msg, msg.Length, ipep);
bool flag = result >= msg.Length;
Console.WriteLine("Send to {0}:{1} => {2}, {3}", ip, port, DataMessage.ToHexString(msg), flag);
return flag;
}
public bool SendMessage(IPEndPoint ipep, byte[] byteMsg)
{
int result = SendUdp.Send(byteMsg, byteMsg.Length, ipep);
return result >= byteMsg.Length;
}
#endregion Send
1 year ago
}