private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { //DbHelperSQL.UseXml(); //string cmd = "insert into 连接表 values ('"+acceptEventArgs.AcceptSocket.RemoteEndPoint.ToString()+"','"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")+"')"; //DbHelperSQL.Execute(cmd); FrmMain.frm.txtLink.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ":" + acceptEventArgs.AcceptSocket.RemoteEndPoint.ToString() + "\r\n"); FrmMain.frm.cboUser.Items.Add(acceptEventArgs.AcceptSocket.RemoteEndPoint.ToString()); AsyncSocketUserToken userToken = m_asyncSocketUserTokenPool.Pop(); m_asyncSocketUserTokenList.Add(userToken); //添加到正在连接列表 FrmMain.frm.lblCount.Text = m_asyncSocketUserTokenList.Count().ToString(); userToken.ConnectSocket = acceptEventArgs.AcceptSocket; userToken.ConnectDateTime = DateTime.Now; //连入时间 userToken.ActiveDateTime = DateTime.Now; //活动时间 try { bool willRaiseEvent = userToken.ConnectSocket.ReceiveAsync(userToken.ReceiveEventArgs); //投递接收请求 if (!willRaiseEvent) { lock (userToken) { ProcessReceive(userToken.ReceiveEventArgs); } } } catch { } StartAccept(acceptEventArgs); //把当前异步事件释放,等待下次连接 }
void IO_Completed(object sender, SocketAsyncEventArgs asyncEventArgs) { AsyncSocketUserToken userToken = asyncEventArgs.UserToken as AsyncSocketUserToken; userToken.ActiveDateTime = DateTime.Now; try { lock (userToken) { if (asyncEventArgs.LastOperation == SocketAsyncOperation.Receive) { ProcessReceive(asyncEventArgs); } else if (asyncEventArgs.LastOperation == SocketAsyncOperation.Send) { ProcessSend(asyncEventArgs); } else { throw new ArgumentException("The last operation completed on the socket was not a receive or send"); } } } catch (Exception E) { MessageBox.Show(E.ToString()); } }
public void Remove(AsyncSocketUserToken userToken) { lock (m_list) { m_list.Remove(userToken); } }
public BaseSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_userName = ""; m_logined = false; m_socketFlag = ""; }
public void Add(AsyncSocketUserToken userToken) { lock (m_list) { m_list.Add(userToken); } }
public void CloseClientSocket(AsyncSocketUserToken userToken) { if (userToken.ConnectSocket == null) { return; } string socketInfo = string.Format("Local Address: {0} Remote Address: {1}", userToken.ConnectSocket.LocalEndPoint, userToken.ConnectSocket.RemoteEndPoint); try { string sql = "DELETE FROM DevicePing WHERE ip='" + userToken.ConnectSocket.RemoteEndPoint.ToString() + "'"; DbHelperSQL.ExecuteSql(sql); userToken.ConnectSocket.Shutdown(SocketShutdown.Both); userToken.ConnectSocket.Close(); userToken.ConnectSocket = null; //释放引用,并清理缓存,包括释放协议对象等资源 m_maxNumberAcceptedClients.Release(); m_asyncSocketUserTokenPool.Push(userToken); m_asyncSocketUserTokenList.Remove(userToken); //FrmMain.frm.txtLink.AppendText(".....关闭成功!\r\n"); FrmMain.frm.lblCount.Text = m_asyncSocketUserTokenList.Count().ToString(); } catch { } //DbHelperSQL.UseXml(); //string cmd = "insert into 退出表 values ('" + userToken.ConnectSocket.RemoteEndPoint.ToString() + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "')"; //DbHelperSQL.Execute(cmd); //FrmMain.frm.txtLink.AppendText(DateTime.Now.ToString()+userToken.ConnectSocket.RemoteEndPoint.ToString()+ ":正在关闭"); }
public void CopyList(ref AsyncSocketUserToken[] array) { lock (m_list) { array = new AsyncSocketUserToken[m_list.Count]; m_list.CopyTo(array); } }
private void ProcessReceive(SocketAsyncEventArgs receiveEventArgs) { AsyncSocketUserToken userToken = receiveEventArgs.UserToken as AsyncSocketUserToken; if (userToken.ConnectSocket == null) { return; } userToken.ActiveDateTime = DateTime.Now;//记录客户端活动时间 if (userToken.ReceiveEventArgs.BytesTransferred > 0 && userToken.ReceiveEventArgs.SocketError == SocketError.Success) { int offset = userToken.ReceiveEventArgs.Offset; int count = userToken.ReceiveEventArgs.BytesTransferred; userToken.AsyncSocketInvokeElement = new UploadSocketProtocol(this, userToken); if ((userToken.AsyncSocketInvokeElement == null) & (userToken.ConnectSocket != null)) //存在Socket对象,并且没有绑定协议对象,则进行协议对象绑定 { offset = offset + 1; count = count - 1; } if (userToken.AsyncSocketInvokeElement == null) //如果没有解析对象,提示非法连接并关闭连接 { CloseClientSocket(userToken); } else { if (count > 0) //处理接收数据 { if (!userToken.AsyncSocketInvokeElement.ProcessReceive(userToken.ReceiveEventArgs.Buffer, offset, count)) { //如果处理数据返回失败,则断开连接 CloseClientSocket(userToken); } else //否则投递下次介绍数据请求 { bool willRaiseEvent = userToken.ConnectSocket.ReceiveAsync(userToken.ReceiveEventArgs); //投递接收请求 if (!willRaiseEvent) { ProcessReceive(userToken.ReceiveEventArgs); } } } else { bool willRaiseEvent = userToken.ConnectSocket.ReceiveAsync(userToken.ReceiveEventArgs); //投递接收请求 if (!willRaiseEvent) { ProcessReceive(userToken.ReceiveEventArgs); } } } } else { CloseClientSocket(userToken); } }
public UploadSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_socketFlag = "Upload"; m_fileName = ""; m_fileStream = null; lock (m_asyncSocketServer.UploadSocketProtocolMgr) { m_asyncSocketServer.UploadSocketProtocolMgr.Add(this); } }
public void Push(AsyncSocketUserToken item) { if (item == null) { throw new ArgumentException("Items added to a AsyncSocketUserToken cannot be null"); } lock (m_pool) { m_pool.Push(item); } }
public void Init() { AsyncSocketUserToken userToken; for (int i = 0; i < m_numConnections; i++) //按照连接数建立读写对象 { userToken = new AsyncSocketUserToken(m_receiveBufferSize); userToken.ReceiveEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); userToken.SendEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); m_asyncSocketUserTokenPool.Push(userToken); } }
public LogOutputSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_socketFlag = "LogOutput"; m_logFixedBuffer = new LogFixedBuffer(); lock (FrmMain.AsyncSocketSvr.LogOutputSocketProtocolMgr) { FrmMain.AsyncSocketSvr.LogOutputSocketProtocolMgr.Add(this); } SendResponse(); }
public DownloadSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_socketFlag = "Download"; m_fileName = ""; m_fileStream = null; m_sendFile = false; m_packetSize = 64 * 1024; lock (m_asyncSocketServer.DownloadSocketProtocolMgr) { m_asyncSocketServer.DownloadSocketProtocolMgr.Add(this); } }
public AsyncSocketInvokeElement(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) { m_asyncSocketServer = asyncSocketServer; m_asyncSocketUserToken = asyncSocketUserToken; m_netByteOrder = false; m_incomingDataParser = new IncomingDataParser(); m_outgoingDataAssembler = new OutgoingDataAssembler(); m_sendAsync = false; m_connectDT = DateTime.UtcNow; m_activeDT = DateTime.UtcNow; }
public AsyncSocketUserToken UseKey(int gateWay) { AsyncSocketUserToken UserToken = null; lock (m_list) { for (int i = 0; i < m_list.Count; i++) { if (m_list[i].GateWayId == gateWay) { UserToken = m_list[i]; } } return(UserToken); } }
private bool ProcessSend(SocketAsyncEventArgs sendEventArgs) { AsyncSocketUserToken userToken = sendEventArgs.UserToken as AsyncSocketUserToken; if (userToken.AsyncSocketInvokeElement == null) { return(false); } userToken.ActiveDateTime = DateTime.Now; if (sendEventArgs.SocketError == SocketError.Success) { return(userToken.AsyncSocketInvokeElement.SendCompleted()); //调用子类回调函数 } else { CloseClientSocket(userToken); return(false); } }
public ControlSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_socketFlag = "Control"; }
public bool SendPacket(string str) { #region 发送函数 //Web发送的命令格式为deviceID-文件编号 string[] sArray = str.Split('-'); int device_ID = int.Parse(sArray[0]); int fileCode = int.Parse(sArray[1]); string cmd = "select pathName from DeviceInfo where DeviceID='" + device_ID + "'";//这一步可以不用,直接用变量加路径 string path = DbHelperSQL.Execute(cmd).Trim(); //for (int i = 99; i <= 115; i++) //{ string newPath = ""; //switch (fileCode) //{ // case 0x5A: // newPath = Path.Combine(path, "name.xml"); // break; // case 0: newPath = Path.Combine(path, "tmp.xml"); // break; // case 1: // newPath = Path.Combine(path, "mode1.xml"); // break; // case 2: // newPath = Path.Combine(path, "mode2.xml"); // break; // case 3: // newPath = Path.Combine(path, "mode3.xml"); // break; // case 4: // newPath = Path.Combine(path, "mode4.xml"); // break; // case 5: // newPath = Path.Combine(path, "mode5.xml"); // break; // case 6: // newPath = Path.Combine(path, "mode6.xml"); // break; // case 7: // newPath = Path.Combine(path, "mode7.xml"); // break; // case 8: // newPath = Path.Combine(path, "mode8.xml"); // break; // case 9: // newPath = Path.Combine(path, "mode9.xml"); // break; // case 10: // newPath = Path.Combine(path, "mode10.xml"); // break; // case 11: // newPath = Path.Combine(path, "mode11.xml"); // break; // case 12: // newPath = Path.Combine(path, "mode12.xml"); // break; // case 13: // newPath = Path.Combine(path, "mode13.xml"); // break; // case 14: // newPath = Path.Combine(path, "mode14.xml"); // break; // case 15: // newPath = Path.Combine(path, "mode15.xml"); // break; // case 16: // newPath = Path.Combine(path, "mode16.xml"); // break; // case 17: // newPath = Path.Combine(path, "mode17.xml"); // break; // case 18: // newPath = Path.Combine(path, "mode18.xml"); // break; // case 19: // newPath = Path.Combine(path, "mode19.xml"); // break; // case 20: // newPath = Path.Combine(path, "mode20.xml"); // break; // case 21: // newPath = Path.Combine(path, "mode21.xml"); // break; // case 22: // newPath = Path.Combine(path, "mode22.xml"); // break; // case 23: // newPath = Path.Combine(path, "mode23.xml"); // break; // case 24: // newPath = Path.Combine(path, "mode24.xml"); // break; // default: // break; //} byte[] buf = { 0X68, 0, 0, 0, 0, 0, 0, 0, 0, (byte)fileCode }; using (FileStream fsRead = new FileStream(newPath, FileMode.Open, FileAccess.Read)) { byte[] bf = new byte[1024 * 100]; int r = fsRead.Read(bf, 0, bf.Length); byte[] copy = new byte[r]; List <byte> listSend = new List <byte>(); listSend.AddRange(buf); listSend.Add((byte)(r & 0x00FF)); //低字节 listSend.Add((byte)(r >> 8)); //高字节 Array.Copy(bf, copy, r); listSend.AddRange(copy); byte[] CRC = AuxiliaryMethod.crc16(listSend.ToArray(), listSend.Count);//调用校验 listSend.AddRange(CRC); listSend.Add(0x16); AsyncSocketUserToken UserToken = m_asyncSocketServer.AsyncSocketUserTokenList.UseKey(device_ID); lock (UserToken) { UserToken.ConnectSocket.Send(listSend.ToArray()); // UserToken.SendEventArgs.ConnectSocket.Send(listSend.ToArray()); } listSend.Clear(); } //} string m_message = "send Success"; m_asyncSocketUserToken.ConnectSocket.Send(PackData(m_message).ToArray()); Thread.Sleep(20); return(true); #endregion }
public RemoteStreamSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_socketFlag = "RemoteStream"; m_fileStream = null; }
public ThroughputSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken) : base(asyncSocketServer, asyncSocketUserToken) { m_socketFlag = "Throughput"; }
public void SendThreadStart() { DataTable dt = new DataTable(); string hs_sql, cmd, path, newPath; int device_ID; byte[] buf = { 0X68, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; while (true) { #region //if (m_asyncSocketServer.Redis.ListLength("commands") > 0) //{ // #region // try // { // string commandStr = m_asyncSocketServer.Redis.ListRightPop<string>("commands"); // SendOption sendOption = JsonConvert.DeserializeObject<SendOption>(commandStr); // int gateWay = Convert.ToInt32(sendOption.Gateway); // if (m_asyncSocketServer.AsyncSocketUserTokenList.ContainKey(gateWay)) // { // byte[] gateway_number = AuxiliaryMethod.intTo4Bytes(gateWay); // byte[] devices_number = AuxiliaryMethod.intTo4Bytes(Convert.ToInt32(sendOption.Devices)); // byte[] commandType = AuxiliaryMethod.StringToBytes(sendOption.Order); // //string str = sendOption.Command; // byte[] commandvalues = AuxiliaryMethod.StringToBytes(sendOption.Command); // if (commandvalues.Length < 9) // { // byte[] dataLength = { 0, 8 }; // byte startFrame = 0x68; //拼凑帧头 // byte endFrame = 0x16; //帧尾 // listSend.Add(startFrame); //全部添加listSend // listSend.AddRange(gateway_number); // listSend.AddRange(devices_number); // listSend.AddRange(commandType); // listSend.AddRange(dataLength); // listSend.AddRange(commandvalues); // byte[] CRC = AuxiliaryMethod.crc16(listSend.ToArray(), listSend.Count);//调用校验, // listSend.AddRange(CRC); //将校验数据添加listSend // listSend.Add(endFrame); // } // else // { // byte[] dataLength = { 0, 0x0A }; // byte startFrame = 0x68; //拼凑帧头 // byte endFrame = 0x16; //帧尾 // listSend.Add(startFrame); //全部添加listSend // listSend.AddRange(gateway_number); // listSend.AddRange(devices_number); // listSend.AddRange(commandType); // listSend.AddRange(dataLength); // listSend.AddRange(commandvalues); // byte[] CRC = AuxiliaryMethod.crc16(listSend.ToArray(), listSend.Count);//调用校验, // listSend.AddRange(CRC); //将校验数据添加listSend // listSend.Add(endFrame); // } // #endregion // AsyncSocketUserToken UserToken = m_asyncSocketServer.AsyncSocketUserTokenList.UseKey(gateWay); // lock (UserToken) // { // UserToken.ConnectSocket.Send(listSend.ToArray()); // } // listSend.Clear(); // Thread.Sleep(50); // } // } // catch // { // } //} //else //{ // Thread.Sleep(50); //} #endregion hs_sql = "select * from SendTable"; dt = DbHelperSQL.OpenTable(hs_sql); if (dt.Rows.Count > 0) { #region hs_sql = "Truncate table SendTable";//清除表中所有行,保留表结构、与delete类似比delete速度快,而且效率高,使用的系统和事务日志资源少 DbHelperSQL.ExecuteSql(hs_sql); for (int i = 0; i < dt.Rows.Count; i++) { try { device_ID = Convert.ToInt32(dt.Rows[i][2]); cmd = "select pathName from DeviceInfo where DeviceID='" + device_ID + "'";//这一步可以不用,直接用变量加路径 path = DbHelperSQL.Execute(cmd).Trim(); newPath = Path.Combine(path, "tmp.xml"); using (FileStream fsRead = new FileStream(newPath, FileMode.Open, FileAccess.Read)) { byte[] bf = new byte[1024 * 200];//声明一个数组存储xml文件数据最大200k int r = fsRead.Read(bf, 0, bf.Length); byte[] copy = new byte[r]; List <byte> listSend = new List <byte>(); listSend.AddRange(buf); listSend.Add((byte)(r & 0x00FF)); //低字节 listSend.Add((byte)(r >> 8)); //高字节 Array.Copy(bf, copy, r); listSend.AddRange(copy); byte[] CRC = AuxiliaryMethod.crc16(listSend.ToArray(), listSend.Count);//调用校验 listSend.AddRange(CRC); listSend.Add(0x16); AsyncSocketUserToken UserToken = m_asyncSocketServer.AsyncSocketUserTokenList.UseKey(device_ID); lock (UserToken) { UserToken.ConnectSocket.Send(listSend.ToArray()); } listSend.Clear(); //hs_sql = "UPDATE HistSendTable SET SendResult='Send Success!' WHERE SendTime = '" + dt.Rows[i][3].ToString().Trim() + "' "; //DbHelperSQL.ExecuteSql(hs_sql); } } catch (Exception e) { hs_sql = "UPDATE HistSendTable SET SendResult='" + e.ToString() + "' WHERE SendTime = '" + dt.Rows[i][3].ToString().Trim() + "' "; DbHelperSQL.ExecuteSql(hs_sql); } #endregion } } else { Thread.Sleep(50); } } }