初始化
This commit is contained in:
296
Face.Services/UDP/UDPHelp.cs
Normal file
296
Face.Services/UDP/UDPHelp.cs
Normal file
@@ -0,0 +1,296 @@
|
||||
using Face.Services;
|
||||
using Face.Services.Manager;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace FaceMachines.Services
|
||||
{
|
||||
public partial class UDPHelp
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 用于UDP发送的网络服务类Socket
|
||||
/// </summary>
|
||||
static Socket socketRecv = null;
|
||||
|
||||
/// <summary>
|
||||
/// 本机IP端口信息
|
||||
/// </summary>
|
||||
static IPEndPoint localIpep = null;
|
||||
|
||||
/// <summary>
|
||||
/// 开关:在监听UDP报文阶段为true,否则为false
|
||||
/// </summary>
|
||||
static bool IsUdpcRecvStart = false;
|
||||
|
||||
/// <summary>
|
||||
/// 线程:不断监听UDP报文
|
||||
/// </summary>
|
||||
static Thread thrRecv;
|
||||
|
||||
/// <summary>
|
||||
/// 开启监听
|
||||
/// </summary>
|
||||
public static void StartReceive()
|
||||
{
|
||||
//if (!IsUdpcRecvStart) // 未监听的情况,开始监听
|
||||
//{
|
||||
//localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7254); // 本机IP和监听端口号
|
||||
localIpep = new IPEndPoint(IPAddress.Any, 5920); // 本机IP和监听端口号
|
||||
|
||||
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
|
||||
//IPEndPoint[] ipEndPoints = ipProperties.GetActiveUdpListeners();
|
||||
var portCount = ipProperties.GetActiveUdpListeners().Where(x => x.Port == 5920).Count();
|
||||
|
||||
if (portCount == 0)
|
||||
{
|
||||
socketRecv = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
||||
socketRecv.Bind(localIpep);
|
||||
|
||||
thrRecv = new Thread(new ThreadStart(ReceiveMessage)); //开辟一个新线程
|
||||
|
||||
if (thrRecv.ThreadState != ThreadState.Running)
|
||||
{
|
||||
thrRecv.Start();
|
||||
IsUdpcRecvStart = true;
|
||||
Logs.WriteTimingUDPLog("UDP监听器已成功启动,IP:" + localIpep);
|
||||
}
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关闭监听
|
||||
/// </summary>
|
||||
public static void StopReceive()
|
||||
{
|
||||
if (IsUdpcRecvStart)
|
||||
{
|
||||
thrRecv.Abort(); // 必须先关闭这个线程,否则会异常
|
||||
//udpcRecv.Close();
|
||||
socketRecv.Close();
|
||||
IsUdpcRecvStart = false;
|
||||
Logs.WriteTimingUDPLog("UDP监听器已成功关闭");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 接收数据
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private static void ReceiveMessage()
|
||||
{
|
||||
while (IsUdpcRecvStart)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 接收
|
||||
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
|
||||
EndPoint Remote = (EndPoint)sender;
|
||||
byte[] data = new byte[256];
|
||||
int len = socketRecv.ReceiveFrom(data, ref Remote);
|
||||
|
||||
string result = BitConverter.ToString(data, 0, len);
|
||||
|
||||
UdpMsgHandle(data, len, Remote);
|
||||
|
||||
Logs.WriteTimingUDPLog("UDP接收数据:{来源IP:" + Remote + " ,数据包:" + result + " }");
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logs.WriteErrorTimingUDPLog("UDP接收错误:", ex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送信息
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private static void SendMessage(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
string message = (string)obj;
|
||||
byte[] sendbytes = Encoding.Unicode.GetBytes(message);
|
||||
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8819); // 发送到的IP地址和端口号
|
||||
socketRecv.SendTo(sendbytes, sendbytes.Length, SocketFlags.None, remoteIpep);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logs.WriteErrorTimingUDPLog("UDP发送", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理UDP信息
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="len"></param>
|
||||
/// <param name="Remote"></param>
|
||||
public static void UdpMsgHandle(byte[] data, int len, EndPoint Remote)
|
||||
{
|
||||
var keyNum = Convert.ToInt32(data[2]);//数据包长度
|
||||
|
||||
var checkValue = data[3];//校验位
|
||||
Array.Clear(data, 3, 1);//data 从起始位置4, 删除1个位置
|
||||
var packetSum = AddMsgByte(data);//数据包累加
|
||||
var checkSum = (byte)((255 - packetSum) & 0xFF);
|
||||
|
||||
if ((len - keyNum) == 5 && checkSum == checkValue)
|
||||
{
|
||||
var sID = BitConverter.ToInt32(data, 5);
|
||||
DevManageHelp.UdpDevServiceHandle(sID);
|
||||
|
||||
IPEndPoint endpoint = Remote as IPEndPoint;
|
||||
|
||||
var ipByte = endpoint.Address.GetAddressBytes();
|
||||
|
||||
var retMsg = new byte[256];
|
||||
Buffer.BlockCopy(data, 0, retMsg, 0, 3);
|
||||
retMsg[4] = Convert.ToByte(data[4] + 0xA0);
|
||||
|
||||
Buffer.BlockCopy(ipByte, 0, retMsg, 5, ipByte.Length);
|
||||
|
||||
var num = AddMsgByte(retMsg);
|
||||
retMsg[3] = (byte)((255 - num) & 0xFF);
|
||||
socketRecv.SendTo(retMsg, len, SocketFlags.None, Remote);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 累加十六进制数据
|
||||
/// </summary>
|
||||
/// <param name="retMsg"></param>
|
||||
/// <returns></returns>
|
||||
public static int AddMsgByte(byte[] retMsg)
|
||||
{
|
||||
//var len = retMsg.Length;
|
||||
var num = 0;
|
||||
for (var i = 0; i < retMsg.Length; i++)
|
||||
{
|
||||
num += retMsg[i];
|
||||
}
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public partial class UDPHelp_New
|
||||
{
|
||||
/// <summary>
|
||||
/// 累加十六进制数据
|
||||
/// </summary>
|
||||
/// <param name="retMsg"></param>
|
||||
/// <returns></returns>
|
||||
public static int AddMsgByte(byte[] retMsg)
|
||||
{
|
||||
//var len = retMsg.Length;
|
||||
var num = 0;
|
||||
for (var i = 0; i < retMsg.Length; i++)
|
||||
{
|
||||
num += retMsg[i];
|
||||
}
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
public static void CreatSocket()
|
||||
{
|
||||
try
|
||||
{
|
||||
int port = 5930;
|
||||
string host = "127.0.0.1";
|
||||
|
||||
/**/
|
||||
///创建终结点(EndPoint)
|
||||
IPAddress ip = IPAddress.Parse(host); //把ip地址字符串转换为IPAddress类型的实例
|
||||
IPEndPoint ipe = new IPEndPoint(ip, port); //用指定的端口和ip初始化IPEndPoint类的新实例
|
||||
|
||||
/**/
|
||||
///创建终结点(EndPoint)
|
||||
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
||||
|
||||
foreach (IPAddress address in Dns.GetHostEntry(host).AddressList)
|
||||
{
|
||||
if (address.AddressFamily.ToString() == "InterNetwork")
|
||||
{
|
||||
IPAddress hostIP = address;
|
||||
IPEndPoint ipe2 = new IPEndPoint(address, 5930);
|
||||
socket.Bind(ipe2); //绑定EndPoint对像
|
||||
//socket.Listen(0); //开始监听
|
||||
|
||||
//接受到client连接,为此连接建立新的socket,并接受信息
|
||||
while (true) //定义循环,以便可以简历N次连接
|
||||
{
|
||||
Socket temp = socket.Accept(); //为新建连接创建新的socket
|
||||
|
||||
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
|
||||
EndPoint Remote = (EndPoint)sender;
|
||||
|
||||
byte[] recvBytes = new byte[256];
|
||||
int bytes = temp.ReceiveFrom(recvBytes, ref Remote); //从客户端接受信息
|
||||
|
||||
var sID = BitConverter.ToInt32(recvBytes, 5);
|
||||
DevManageHelp.UdpDevServiceHandle(sID);
|
||||
|
||||
string recvStr = BitConverter.ToString(recvBytes, 0, bytes);
|
||||
|
||||
var retMsg = UdpMsgHandle_New(recvBytes, bytes, Remote);
|
||||
temp.Send(retMsg, bytes, 0);//返回信息给客户端
|
||||
|
||||
if (temp != null)
|
||||
temp.Close();
|
||||
|
||||
Logs.WriteTimingUDPLog("UDP接收-IP:" + Remote + ",数据包:" + recvStr);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logs.WriteErrorTimingUDPLog("UDP监听器开启错误:", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] UdpMsgHandle_New(byte[] data, int len, EndPoint Remote)
|
||||
{
|
||||
var retMsg = new byte[256];
|
||||
var keyNum = Convert.ToInt32(data[2]);
|
||||
if ((len - keyNum) == 5)
|
||||
{
|
||||
IPEndPoint endpoint = Remote as IPEndPoint;
|
||||
//IPAddress ip = endpoint.Address;
|
||||
|
||||
var ipByte = endpoint.Address.GetAddressBytes();
|
||||
//var ipByte = new byte[] { 183, 12, 223, 210 };
|
||||
|
||||
retMsg[0] = data[0];
|
||||
retMsg[1] = data[1];
|
||||
retMsg[2] = data[2];
|
||||
retMsg[4] = Convert.ToByte(data[4].ToInt() + 160);
|
||||
|
||||
retMsg[5] = ipByte[0];
|
||||
retMsg[6] = ipByte[1];
|
||||
retMsg[7] = ipByte[2];
|
||||
retMsg[8] = ipByte[3];
|
||||
|
||||
var num = AddMsgByte(retMsg);
|
||||
retMsg[3] = (byte)((255 - num) & 0xFF);
|
||||
}
|
||||
return retMsg;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user