Beispiel #1
0
        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();
            }
        }