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(); } }
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); } } }
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); } }
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); } }