示例#1
0
        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); //把当前异步事件释放,等待下次连接
        }
示例#2
0
        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());
            }
        }
示例#3
0
 public void Remove(AsyncSocketUserToken userToken)
 {
     lock (m_list)
     {
         m_list.Remove(userToken);
     }
 }
示例#4
0
 public BaseSocketProtocol(AsyncSocketServer asyncSocketServer, AsyncSocketUserToken asyncSocketUserToken)
     : base(asyncSocketServer, asyncSocketUserToken)
 {
     m_userName   = "";
     m_logined    = false;
     m_socketFlag = "";
 }
示例#5
0
 public void Add(AsyncSocketUserToken userToken)
 {
     lock (m_list)
     {
         m_list.Add(userToken);
     }
 }
示例#6
0
        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()+ ":正在关闭");
        }
示例#7
0
 public void CopyList(ref AsyncSocketUserToken[] array)
 {
     lock (m_list)
     {
         array = new AsyncSocketUserToken[m_list.Count];
         m_list.CopyTo(array);
     }
 }
示例#8
0
        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);
     }
 }
示例#10
0
 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);
     }
 }
示例#11
0
        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);
            }
        }
示例#12
0
        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;
        }
示例#15
0
        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);
            }
        }
示例#16
0
        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);
            }
        }
示例#17
0
 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
        }
示例#19
0
 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";
 }
示例#21
0
        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);
                }
            }
        }