using DllFileSoc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace FileToMD5 { public partial class ConSocket : Form { Socket filesocket = null; public ConSocket() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string errorinfo = string.Empty; filesocket = ConnServer(ref errorinfo); lblend.Text = errorinfo; TimerSatrt(); } public void TimerSatrt() { System.Timers.Timer timer = new System.Timers.Timer(); timer.Enabled = true; //timer.Interval = 1000*60*60;//执行间隔时间 1小时一次 timer.Interval = 1000 * 30; timer.Start(); timer.Elapsed += new System.Timers.ElapsedEventHandler(CheckRealIP); } public void CheckRealIP(object sender, System.Timers.ElapsedEventArgs e) { string errorinfo = string.Empty; try { byte[] datas = GetFileDatas(5888, 1, ""); filesocket.Send(datas); int alllen = 0; datas = ReadData(filesocket, ref alllen, ref errorinfo);//接收反馈包 if (datas == null) { LogBLL.Err(errorinfo); } else { byte[] statusdatas = new byte[4]; Array.Copy(datas, 8, statusdatas, 0, 4); int status = BitConverter.ToInt32(statusdatas, 0); byte[] getinfo = new byte[datas.Length - 12]; Array.Copy(datas, 12, getinfo, 0, getinfo.Length); string info = Encoding.UTF8.GetString(getinfo); LogBLL.Err(info); //if (status == 1)//根据MAC更新RealIP成功,关闭通信 //{ // if (filesocket!=null) // filesocket.Close(); //} if (filesocket != null) filesocket.Close(); //else//更新失败,使用之前的方法(根据机台ID更新RealIP) //{ // if (!CheckIP(int.Parse(PubInfo.MacID), ref errorinfo)) // { // LOG.log(errorinfo); // } // if (filesocket != null) // filesocket.Close(); //} } lblend.Text = errorinfo; } catch (Exception ex) { LogBLL.Err(ex.Message); lblend.Text = errorinfo; } } private Socket ConnServer( ref string errorinfo) { try { IPAddress ip = IPAddress.Parse(txtip.Text);//服务端所在IP //IPEndPoint ipEnd = new IPEndPoint(ip, 5888);//服务端所监听的接口 IPEndPoint ipEnd = new IPEndPoint(ip,Convert.ToInt32(txtport.Text));//服务端所监听的接口 Socket CurrSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化一个Socket对象 CurrSocket.Connect(ipEnd); //此语句只支持windows系统,不支持linux系统 //CurrSocket.IOControl(IOControlCode.KeepAliveValues, GetKeepAliveData(), null); ////处理来自机台的包,设置接受超时时间 CurrSocket.ReceiveTimeout = 1000*5; CurrSocket.SendTimeout = 1000 * 5; errorinfo = "连接成功!!!"; return CurrSocket; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } private void btnclose_Click(object sender, EventArgs e) { if (filesocket != null) { filesocket.Close(); lblend.Text = "关闭成功~"; } } private byte[] GetFileDatas(Int32 mode, Int32 result, string msg) { byte[] msgbytes = Encoding.UTF8.GetBytes(msg); Int32 len = msgbytes.Length + 12; byte[] alldatas = BitConverter.GetBytes(len); byte[] forAll = (alldatas.Concat(BitConverter.GetBytes(mode)).Concat(BitConverter.GetBytes(result)).Concat(msgbytes)).ToArray(); return forAll; } private byte[] ReadData(Socket CurrSocket, ref int alllen, ref string errorinfo) { byte[] allbuffs = null; try { byte[] tempbuff = new byte[4]; byte[] bytesbuff = new byte[4]; int result = 0; int levlen = 4; int zerocount = 0; while (levlen > 0) { //说明前面4位还没接受完,需要继续接受 result = CurrSocket.Receive(tempbuff, levlen, SocketFlags.None);//先读取4位块长度字节 if (result == 0 && zerocount <= 20) { zerocount++; //如果返回数据长度为0,则休眠1秒钟,然后继续读取 Thread.Sleep(1000); continue; } if (result <= 0) { errorinfo = $"未能从待机程序监听上读取数据,可能机台已经断开了,接受长度={result} "; return null; } if (result < levlen) { //添加测试代码 //int a = 10; } if (result > 0) { Array.Copy(tempbuff, 0, bytesbuff, 4 - levlen, result); } levlen = levlen - result; } //Array.Reverse(bytesbuff);//20200920 int len = BitConverter.ToInt32(bytesbuff, 0) - 4; alllen = len; if (len > 10) { int a = 10; } byte[] buffs = new byte[len]; tempbuff = new byte[len]; levlen = len; zerocount = 0; while (levlen > 0) { //说明还没接受完,需要继续接受 result = CurrSocket.Receive(tempbuff, levlen, SocketFlags.None); if (result == 0 && zerocount <= 20) { zerocount++; //如果返回数据长度为0,则休眠1秒钟,然后继续读取 Thread.Sleep(1000); continue; } if (result <= 0) { errorinfo = $"未能从待机程序监听上读取数据,可能机台已经断开了,接受长度={result} "; return null; } if (result > 0) { Array.Copy(tempbuff, 0, buffs, len - levlen, result); } levlen = levlen - result; } //result =mysocket.Receive(buffs,len,SocketFlags.None); //Array.Reverse(bytesbuff);//20200920 allbuffs = new byte[len + 4]; Array.Copy(bytesbuff, allbuffs, 4); Array.Copy(buffs, 0, allbuffs, 4, len); alllen = len + 4; return allbuffs; } catch (SocketException ex) { errorinfo = "待机程序Socket接受数据发生异常,错误信息为:" + ex.SocketErrorCode.ToString(); return null; } catch (Exception ex) { errorinfo = ex.Message.ToString(); errorinfo = "待机程序Socket接受数据发生异常,错误信息为:" + errorinfo; return null; } } } }