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 { /// /// 用于UDP发送的网络服务类Socket /// static Socket socketRecv = null; /// /// 本机IP端口信息 /// static IPEndPoint localIpep = null; /// /// 开关:在监听UDP报文阶段为true,否则为false /// static bool IsUdpcRecvStart = false; /// /// 线程:不断监听UDP报文 /// static Thread thrRecv; /// /// 开启监听 /// 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); } } //} } /// /// 关闭监听 /// public static void StopReceive() { if (IsUdpcRecvStart) { thrRecv.Abort(); // 必须先关闭这个线程,否则会异常 //udpcRecv.Close(); socketRecv.Close(); IsUdpcRecvStart = false; Logs.WriteTimingUDPLog("UDP监听器已成功关闭"); } } /// /// 接收数据 /// /// 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; } } } /// /// 发送信息 /// /// 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); } } /// /// 处理UDP信息 /// /// /// /// 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); } } /// /// 累加十六进制数据 /// /// /// 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 { /// /// 累加十六进制数据 /// /// /// 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; } } }