private void AsyncReceiveComplete(object sender, SocketAsyncEventArgs e) { try { lock (this) { if (policy == false && m_receiveBuffer[0] == '<') { policy = true; m_socket.Sockets.Send(POLICY); return; } if (e.BytesTransferred > 0) { #region ParseBuffer int bufferSize = packageBuffSize + e.BytesTransferred; if (bufferSize < Package.HDR_SIZE) { packageBuffSize = bufferSize; return; } packageBuffSize = 0; int curOffset = 0; int dataLeft = bufferSize; int packageLength = 0; int header = 0; while (dataLeft >= Package.HDR_SIZE) { packageLength = 0; if (m_socket.Encryted) { while (curOffset + 4 < bufferSize) { header = m_socket.PackageCrytor.Decryt(m_receiveBuffer[curOffset]) << 8; header += m_socket.PackageCrytor.Decryt(m_receiveBuffer[curOffset + 1]); if ((short)header == Package.HEADER) { packageLength = m_socket.PackageCrytor.Decryt(m_receiveBuffer[curOffset + 2]) << 8; packageLength += m_socket.PackageCrytor.Decryt(m_receiveBuffer[curOffset + 3]); break; } else { curOffset++; } } } else { while (curOffset + 4 < bufferSize) { header = m_receiveBuffer[curOffset] << 8; header += m_receiveBuffer[curOffset + 1]; if ((short)header == Package.HEADER) { packageLength = m_receiveBuffer[curOffset + 2] << 8; packageLength += m_receiveBuffer[curOffset + 3]; break; } else { curOffset++; } } } dataLeft = bufferSize - curOffset; if ((packageLength != 0 && packageLength < Package.HDR_SIZE) || packageLength > m_socket.ReceiveBufferSize) { log.ErrorFormat("读取的数据包长:{0} 包头长:{1} 读取时的当前游标:{2} 当前总数据流长度:{3} 当前收到数据流长度:{4} 来自:{5}", packageLength, Package.HDR_SIZE, curOffset, bufferSize, e.BytesTransferred, m_socket.RemoteEndPoint); log.Error(Marshal.ToHexDump("=======================包数据==========================", m_receiveBuffer)); if (m_socket.Strict) { packageBuffSize = 0; m_socket.Disconnect(); return;//严格模式则释放并退出 } m_socket.PackageCrytor.DecrytOnceComplete(); continue;//继续解析后面的数据包 } Package pkg = null;// = pkgReader.ReadPackage(ref curOffset, ref packageLength, bufferSize, m_receiveBuffer, m_socket); if (dataLeft >= packageLength && packageLength != 0) { pkg = m_socket.ReceiveUsedPacket; if (m_socket.Encryted) { pkg.CopyFromDecryt(m_receiveBuffer, curOffset, 0, packageLength, m_socket.PackageCrytor); m_socket.PackageCrytor.DecrytOnceComplete(); } else { pkg.CopyFrom(m_receiveBuffer, curOffset, 0, packageLength); } pkg.ReadHeader(); if (log.IsInfoEnabled) { log.Info(Marshal.ToHexDump("Recieve Package:", pkg.Buffer, 0, packageLength)); } try { m_socket.ReceivePkg(pkg); } catch (Exception ex) { log.Error("外部数据包处理出错.", ex); } curOffset += packageLength; dataLeft = bufferSize - curOffset; } else { break; } } if (dataLeft > 0) { Array.Copy(m_receiveBuffer, curOffset, m_receiveBuffer, 0, dataLeft); packageBuffSize = dataLeft; } #endregion policy = true; } else// if (m_socket.Sockets.Connected == false) { log.InfoFormat("The client of '{0}' disconnected!", m_socket.RemoteEndPoint); m_socket.Disconnect(); } } } catch (Exception ex) { log.Error("数据包解析出错.", ex); packageBuffSize = 0; m_socket.Disconnect(); } finally { AsyncReceiveImp(); } }