예제 #1
0
        private void parseData(DeviceTcpState stateOne)
        {
            int iHeadIndex = 0;

            //parseBytes(stateOne.ipEndPoint, stateOne.abOneData);
            devHandler.parseBytes(stateOne.ipEndPoint, stateOne.abOneData);
            stateOne.clearData();

            stateOne.iDataStartIndex += stateOne.iOneDataLength - stateOne.iOneDataIndex;
            stateOne.iOneDataLength   = 0;
            stateOne.iOneDataIndex    = 0;
            iHeadIndex = DeviceSignal.haveHead(stateOne.Buffer, stateOne.iDataStartIndex);
            if (iHeadIndex != -1)
            {
                if (iHeadIndex + DeviceSignal.iHeadLength > stateOne.Buffer.Length)
                {
                    stateOne.abBakHeadData = new byte[DeviceSignal.iHeadLength];
                    Array.Copy(stateOne.Buffer, iHeadIndex, stateOne.abBakHeadData,
                               0, stateOne.Buffer.Length - iHeadIndex);
                    stateOne.iBakHeadIndex = stateOne.Buffer.Length - iHeadIndex;
                    stateOne.clearBuffer();
                }
                else
                {
                    stateOne.iDataStartIndex = iHeadIndex;
                    receiveParse(stateOne);
                }
            }
            else
            {
                stateOne.clearBuffer();
            }
        }
예제 #2
0
        private void receiveCallback(IAsyncResult ar)
        {
            DeviceTcpState stateOne = (DeviceTcpState)ar.AsyncState;
            Socket         handler  = stateOne.WorkSocket;

            try
            {
                int bytesRead = handler.EndReceive(ar);
                if (bytesRead > 0)
                {
                    //byte[] haveDate = ReceiveDateOne.DateOneManage(stateOne, bytesRead);//接收完成之后对数组进行重置
                    receiveParse(stateOne);
                    handler.BeginReceive(stateOne.Buffer, 0, stateOne.Buffer.Length, 0, new AsyncCallback(receiveCallback), stateOne);
                    //receiveParse(stateOne);
                    //TcpDateOne(stateOne, haveDate);
                }
                else
                {
                    stateOne.WorkSocket.BeginReceive(stateOne.Buffer, 0, stateOne.Buffer.Length, 0, new AsyncCallback(receiveCallback), stateOne);
                }
            }
            catch (Exception Ex)
            {
                int i = Ex.Message.IndexOf("远程主机强迫关闭了一个现有的连接");
                if (stateOne != null && i != -1)
                {
                    tcpStateList.Remove(stateOne);
                    LogHelper.Log.Info(" remove stateOne.... " + Ex.Message + Ex.StackTrace);
                }
            }
        }
예제 #3
0
        private void acceptCallback(IAsyncResult ar)
        {
            DeviceTcpState stateOne = null;

            try
            {
                devSocketServer.BeginAccept(new AsyncCallback(acceptCallback), devicePort);
            }
            catch (Exception Ex)
            {
                //OnEngineLost(Ex.Message);//当服务器突然断开触发此事件
                //CloseEngine();
                LogHelper.Log.Error(Ex.Message + Ex.StackTrace);
            }
            try
            {
                Socket socketClient = devSocketServer.EndAccept(ar);
                stateOne = new DeviceTcpState(socketClient, TcpBufferSize);
                tcpStateList.Add(stateOne);

                stateOne.WorkSocket.BeginReceive(stateOne.Buffer, 0, stateOne.Buffer.Length, 0, new AsyncCallback(receiveCallback), stateOne);
                LogHelper.Log.Info("设备连接地址 " + stateOne.ipEndPoint);
            }
            catch (Exception Ex)
            {
                LogHelper.Log.Info(Ex.Message + Ex.StackTrace);
            }
        }
예제 #4
0
        private void receiveParse(DeviceTcpState stateOne)
        {
            Device device = devHandler.getDevByIP(stateOne.ipEndPoint);

            try
            {
                //Log.Write(" rev:" + BitConverter.ToString(stateOne.Buffer));
                if (DeviceSignal.isHeadData(stateOne.Buffer, stateOne.iDataStartIndex))
                {
                    if (stateOne.iDataStartIndex + DeviceSignal.iHeadLength <= stateOne.Buffer.Length)
                    {
                        stateOne.iOneDataLength = DeviceSignal.getDataLength(stateOne.Buffer, stateOne.iDataStartIndex);
                        stateOne.abOneData      = new byte[stateOne.iOneDataLength];

                        if (stateOne.Buffer.Length - stateOne.iDataStartIndex >= stateOne.iOneDataLength)
                        {
                            Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abOneData, 0, stateOne.iOneDataLength);
                            parseData(stateOne);
                        }
                        else
                        {
                            //stateOne.abAllData = new byte[stateOne.iDataLength];
                            //stateOne.Buffer.CopyTo(stateOne.abOneData, stateOne.iDataStartIndex);
                            Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abOneData,
                                       stateOne.iOneDataIndex, stateOne.Buffer.Length - stateOne.iDataStartIndex);
                            stateOne.iOneDataIndex += stateOne.Buffer.Length - stateOne.iDataStartIndex;
                            stateOne.clearBuffer();
                        }
                    }
                    else
                    {
                        stateOne.abBakHeadData = new byte[DeviceSignal.iHeadLength];
                        //stateOne.Buffer.CopyTo(stateOne.abBakHeadData, stateOne.iDataStartIndex);
                        Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abBakHeadData,
                                   0, stateOne.Buffer.Length - stateOne.iDataStartIndex);
                        stateOne.iBakHeadIndex = stateOne.Buffer.Length - stateOne.iDataStartIndex;
                        //stateOne.iOneDataIndex += stateOne.Buffer.Length - stateOne.iDataStartIndex;
                        stateOne.clearBuffer();
                    }
                }
                else
                {
                    if ((stateOne.iOneDataLength > 0) && (stateOne.iOneDataIndex > 0))
                    {
                        //stateOne.Buffer.CopyTo(stateOne.abOneData, stateOne.iOneDataIndex);

                        if (stateOne.Buffer.Length + stateOne.iOneDataIndex >= stateOne.iOneDataLength)
                        {
                            Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abOneData,
                                       stateOne.iOneDataIndex, stateOne.iOneDataLength - stateOne.iOneDataIndex);
                            parseData(stateOne);
                        }
                        else
                        {
                            Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abOneData,
                                       stateOne.iOneDataIndex, stateOne.Buffer.Length - stateOne.iDataStartIndex);
                            stateOne.iOneDataIndex += stateOne.Buffer.Length;
                            stateOne.clearBuffer();
                        }
                    }
                    else if (null != stateOne.abBakHeadData)
                    {
                        Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abBakHeadData, stateOne.iBakHeadIndex, DeviceSignal.iHeadLength - stateOne.iBakHeadIndex);
                        if (DeviceSignal.isHeadData(stateOne.abBakHeadData, 0))
                        {
                            stateOne.iOneDataLength = DeviceSignal.getDataLength(stateOne.abBakHeadData, 0);
                            stateOne.abOneData      = new byte[stateOne.iOneDataLength];
                            stateOne.abBakHeadData.CopyTo(stateOne.abOneData, 0);

                            if (stateOne.Buffer.Length + stateOne.iBakHeadIndex >= stateOne.iOneDataLength)
                            {
                                Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abOneData, stateOne.iBakHeadIndex,
                                           stateOne.iOneDataLength - stateOne.iBakHeadIndex);
                                parseData(stateOne);
                            }
                            else
                            {
                                Array.Clear(stateOne.abBakHeadData, 0, stateOne.abBakHeadData.Length);
                                stateOne.abBakHeadData = null;
                                Array.Copy(stateOne.Buffer, stateOne.iDataStartIndex, stateOne.abOneData, stateOne.iBakHeadIndex, stateOne.Buffer.Length);
                                stateOne.iOneDataIndex = stateOne.Buffer.Length + stateOne.iBakHeadIndex;
                                stateOne.clearBuffer();
                            }
                        }
                    }
                }
            }
            catch (Exception Ex)
            {
                stateOne.clearBuffer();
                LogHelper.Log.Info("[ERROR] " + Ex.Message + Ex.StackTrace);
            }
        }