using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using System.Linq; namespace WindowsFormsApp2 { public delegate void callback(string msg); public class Client { //显示端 //显示端 public static byte[] clientIP = new byte[] { 192, 168, 31, 243 }; public static byte[] localIP = new byte[] { 192, 168, 31, 226 }; public static int dataPort = 2999; public static int imagePort = 3999; //图像大小 int w = 80, h = 60; static Client() { for (int i = 1; i < 16; i++) { //license(dataPort + i); //license(imagePort + i); } } public Client() { } public void DisConnection() { try { if (u != null) { m_Done = true; if (recvThread != null) { this.recvThread.Abort(); } if (recvThreadImage != null) { this.recvThreadImage.Abort(); } u.Close(); u = null; } if (uimage != null) uimage.Close(); } catch (Exception) { } } private static void license(int port) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.CreateNoWindow = true; List list_pid = GetPidByPort(p, port); if (list_pid.Count == 0) { return; } List list_process = GetProcessNameByPid(p, list_pid); StringBuilder sb = new StringBuilder(); sb.AppendLine("占用" + port + "端口的进程有:"); foreach (var item in list_process) { sb.Append(item + "\r\n"); } sb.AppendLine("是否要结束这些进程?"); PidKill(p, list_pid); } private static void PidKill(Process p, List list_pid) { p.Start(); foreach (var item in list_pid) { p.StandardInput.WriteLine("taskkill /pid " + item + " /f"); p.StandardInput.WriteLine("exit"); } p.Close(); } private static List GetPidByPort(Process p, int port) { int result; bool b = true; p.Start(); p.StandardInput.WriteLine(string.Format("netstat -ano|find \"{0}\"", port)); p.StandardInput.WriteLine("exit"); StreamReader reader = p.StandardOutput; string strLine = reader.ReadLine(); List list_pid = new List(); while (!reader.EndOfStream) { strLine = strLine.Trim(); if (strLine.Length > 0 && ((strLine.Contains("TCP") || strLine.Contains("UDP")))) { Regex r = new Regex(@"\s+"); string[] strArr = r.Split(strLine); if (strArr.Length >= 4) { b = int.TryParse(strArr[3], out result); if (b && !list_pid.Contains(result)) list_pid.Add(result); } } strLine = reader.ReadLine(); } p.WaitForExit(); reader.Close(); p.Close(); return list_pid; } private static List GetProcessNameByPid(Process p, List list_pid) { p.Start(); List list_process = new List(); foreach (var pid in list_pid) { p.StandardInput.WriteLine(string.Format("tasklist |find \"{0}\"", pid)); p.StandardInput.WriteLine("exit"); StreamReader reader = p.StandardOutput;//截取输出流 string strLine = reader.ReadLine();//每次读取一行 while (!reader.EndOfStream) { strLine = strLine.Trim(); if (strLine.Length > 0 && ((strLine.Contains(".exe")))) { Regex r = new Regex(@"\s+"); string[] strArr = r.Split(strLine); if (strArr.Length > 0) { list_process.Add(strArr[0]); } } strLine = reader.ReadLine(); } p.WaitForExit(); reader.Close(); } p.Close(); return list_process; } private int _bindCamId; UdpClient u=null; IPEndPoint e; UdpClient uimage = null; IPEndPoint eimage; public void bindCamId(int id) { _bindCamId = id; try { e = new IPEndPoint(new IPAddress(localIP), dataPort + _bindCamId); u = new UdpClient(e); recvThread = new Thread(new ThreadStart(Received)); recvThread.Priority = ThreadPriority.Normal; recvThread.Start(); } catch { } try { eimage = new IPEndPoint(new IPAddress(localIP), imagePort + _bindCamId); uimage = new UdpClient(eimage); recvThreadImage = new Thread(new ThreadStart(ReceivedImage)); recvThreadImage.Priority = ThreadPriority.Normal; recvThreadImage.Start(); } catch { } } private Action t; private Action imageCall; private Action j; private Action o; private Action n; private Action speed; private Action kick; private Action total; public void InitLicenseData(Action t, Action j, Action o, Action n, Action speed , Action kick, Action total) { try { this.t = t; this.j = j; this.o = o; this.n = n; this.speed = speed; this.kick = kick; this.total = total; } catch (Exception ex) { System.Diagnostics.Debug.Write("端口号占用" + ex.ToString()); return; } } public void InitLicenseData(Action t) { try { this.t = t; } catch (Exception ex) { System.Diagnostics.Debug.Write("端口号占用" + ex.ToString()); return; } } public void InitLicenseImage(Action total) { try { this.imageCall = total; } catch (Exception ex) { System.Diagnostics.Debug.Write("端口号占用" + ex.ToString()); return; } } bool m_Done = false; public Thread recvThread = null; public Thread recvThreadImage = null; private void Received() { //ASCII 编码 Encoding ASCII = Encoding.ASCII; while (!m_Done) { IPEndPoint endpoint = null; if (u != null && null != recvThread && recvThread.IsAlive) { //接收数据 try { Byte[] data = u.Receive(ref endpoint); //得到数据的ACSII的字符串形式 String receiveString = ASCII.GetString(data); if (t!=null) t(receiveString); } catch { //SOCKETEventArrive("receive:Nullerror"); } } Thread.Sleep(10); //防止系统资源耗尽 } } private void GenImage(byte[] data, out Bitmap bmp) { lock (this) { bmp = new Bitmap(w, h); try { lock (this) { IntPtr pData = Marshal.AllocHGlobal(w * h * 3); Marshal.Copy(data, 0, pData, w * h * 3); bmp = new Bitmap(w, h, w * 3, PixelFormat.Format24bppRgb, pData); } } catch (Exception) { } } } private void ReceivedImage() { //Thread.Sleep(2000); //ASCII 编码 Encoding ASCII = Encoding.ASCII; //Thread.Sleep(30); //防止系统资源耗尽 while (!m_Done) { IPEndPoint endpoint = null; if (u != null && null != recvThread && recvThread.IsAlive) { try { Byte[] receiveBytes = uimage.Receive(ref endpoint); { //Bitmap bm; //GenImage(receiveBytes.Skip(1).Take(receiveBytes.Length - 1).ToArray(), out bm); //imageCall(receiveBytes[0],bm); IntPtr pData = Marshal.AllocHGlobal(w * h * 3); Marshal.Copy(receiveBytes.Skip(1).Take(receiveBytes.Length - 1).ToArray(), 0, pData, w * h * 3); using (Bitmap bm = new Bitmap(w, h, w * 3, PixelFormat.Format24bppRgb, pData)) { imageCall(receiveBytes[0], bm); } Marshal.FreeHGlobal(pData); //free tha memory } } catch { //SOCKETEventArrive("receive:Nullerror"); } } Thread.Sleep(10); //防止系统资源耗尽 } } } }