Exemple #1
0
        private void CalcHeaderCrc(ref GamePackHeader header, byte[] dst)
        {
            int headerCrcSize = Marshal.SizeOf(header.headerCrc32);
            int sz            = Marshal.SizeOf(header) - headerCrcSize;

            mCrc.Crc(dst, headerCrcSize, sz);
            header.headerCrc32 = (uint)mCrc.Value;
            byte[] crc = BitConverter.GetBytes(header.headerCrc32);
            Buffer.BlockCopy(crc, 0, dst, 0, crc.Length);
        }
Exemple #2
0
        // 子线程调用
        private void OnThreadBufferProcess(TcpClient tcp)
        {
            if (tcp == null)
            {
                return;
            }

            int recvsize = mTcpClient.GetReadDataNoLock(mRecvBuffer, mRecvSize);

            if (recvsize > 0)
            {
                mRecvSize += recvsize;
                int            recvBufSz = mRecvSize;
                int            i         = 0;
                GamePackHeader header    = new GamePackHeader();

                int    headerSize   = Marshal.SizeOf(header);
                IntPtr headerBuffer = Marshal.AllocHGlobal(headerSize);
                try {
                    while (recvBufSz - i >= headerSize)
                    {
                        Marshal.Copy(mRecvBuffer, i, headerBuffer, headerSize);
                        header = (GamePackHeader)Marshal.PtrToStructure(headerBuffer, typeof(GamePackHeader));
                        #if USE_NETORDER
                        // used Net
                        header.headerCrc32 = (uint)IPAddress.NetworkToHostOrder(header.headerCrc32);
                        header.dataCrc32   = (uint)IPAddress.NetworkToHostOrder(header.dataCrc32);
                        header.header      = IPAddress.NetworkToHostOrder(header.header);
                        header.dataSize    = IPAddress.NetworkToHostOrder(header.dataSize);
                        #endif
                        if ((recvBufSz - i) < (header.dataSize + headerSize))
                        {
                            break;
                        }
                        GamePacket packet = new GamePacket();
                        packet.header = header;
                        if (packet.header.dataSize <= 0)
                        {
                            packet.header.dataSize = 0;
                            packet.data            = null;
                        }
                        else
                        {
                            packet.data = new byte[packet.header.dataSize];
                            Buffer.BlockCopy(mRecvBuffer, i + headerSize, packet.data, 0, packet.header.dataSize);
                        }

                        LinkedListNode <GamePacket> node = new LinkedListNode <GamePacket>(packet);
                        lock (this)
                        {
                            mPacketList.AddLast(node);
                        }

                        i += headerSize + header.dataSize;
                    }
                } finally {
                    Marshal.FreeHGlobal(headerBuffer);
                }

                recvBufSz -= i;
                mRecvSize  = recvBufSz;
                if (recvBufSz > 0)
                {
                    Buffer.BlockCopy(mRecvBuffer, i, mRecvBuffer, 0, recvBufSz);
                }
            }
        }
Exemple #3
0
        // 支持发送buf为null
        public void Send(byte[] buf, int packetHandle)
        {
            if (mConnecting || (mTcpClient == null))
            {
                return;
            }

            if (mTcpClient.GetState() != eClientState.eClient_STATE_CONNECTED)
            {
                return;
            }

            bool hasBufData = (buf != null) && (buf.Length > 0);

            GamePackHeader header = new GamePackHeader();

            if (hasBufData)
            {
                header.dataSize = buf.Length;
            }
            else
            {
                header.dataSize = 0;
            }

            header.header = packetHandle;

            if (hasBufData)
            {
                mCrc.Crc(buf);
                header.dataCrc32 = (uint)mCrc.Value;
            }
            else
            {
                header.dataCrc32 = 0;
            }

            int headerSize = Marshal.SizeOf(header);
            int dstSize    = headerSize;

            if (hasBufData)
            {
                dstSize += buf.Length;
            }
            byte[] dstBuffer = new byte[dstSize];

            IntPtr pStruct = Marshal.AllocHGlobal(headerSize);

            try {
                Marshal.StructureToPtr(header, pStruct, false);
                Marshal.Copy(pStruct, dstBuffer, 0, headerSize);

#if USE_NETORDER
                // Calc header Crc
                CalcHeaderCrc(ref header, dstBuffer);

                // used net
                header.headerCrc32 = (uint)IPAddress.HostToNetworkOrder(header.headerCrc32);
                header.dataCrc32   = (uint)IPAddress.HostToNetworkOrder(header.dataCrc32);
                header.header      = IPAddress.HostToNetworkOrder(header.header);
                header.dataSize    = IPAddress.HostToNetworkOrder(header.dataSize);

                Marshal.StructureToPtr(header, pStruct, false);
                Marshal.Copy(pStruct, dstBuffer, 0, headerSize);
#endif
            } finally {
                Marshal.FreeHGlobal(pStruct);
            }

#if USE_NETORDER
#else
            // Calc header Crc
            CalcHeaderCrc(ref header, dstBuffer);
#endif
            if (hasBufData)
            {
                Buffer.BlockCopy(buf, 0, dstBuffer, headerSize, buf.Length);
            }
            mTcpClient.Send(dstBuffer);
        }
Exemple #4
0
        public bool Execute()
        {
            //	string threadId = Thread.CurrentThread.ManagedThreadId.ToString ();
            //	Console.WriteLine (threadId);

            if (mTcpClient == null)
            {
                Stop();
                return(false);
            }

            if (mConnecting)
            {
                eClientState state = mTcpClient.GetState();
                if ((state == eClientState.eClient_STATE_CONNECTING) ||
                    (state == eClientState.eCLIENT_STATE_NONE))
                {
                    return(true);
                }

                if ((state == eClientState.eClient_STATE_CONNECT_FAIL) ||
                    (state == eClientState.eClient_STATE_ABORT))
                {
                    mConnecting = false;
                    mAbort      = false;
                    mTcpClient.Release();
                    mTcpClient = null;

                    // Call Event Error
                    if (mStateEvents != null)
                    {
                        mStateEvents(state);
                    }

                    return(false);
                }
                else if (state == eClientState.eClient_STATE_CONNECTED)
                {
                    mConnecting = false;
                    mAbort      = false;

                    // Call Event Success
                    if (mStateEvents != null)
                    {
                        mStateEvents(state);
                    }

                    return(true);
                }

                mConnecting = false;
            }

            if (mTcpClient.HasReadData())
            {
                int recvsize = mTcpClient.GetReadData(mRecvBuffer, mRecvSize);
                if (recvsize > 0)
                {
                    mRecvSize += recvsize;
                    int            recvBufSz = mRecvSize;
                    int            i         = 0;
                    GamePackHeader header    = new GamePackHeader();

                    int    headerSize   = Marshal.SizeOf(header);
                    IntPtr headerBuffer = Marshal.AllocHGlobal(headerSize);
                    try {
                        while (recvBufSz - i >= headerSize)
                        {
                            Marshal.Copy(mRecvBuffer, i, headerBuffer, headerSize);
                            header = (GamePackHeader)Marshal.PtrToStructure(headerBuffer, typeof(GamePackHeader));
#if USE_NETORDER
                            // used Net
                            header.headerCrc32 = (uint)IPAddress.NetworkToHostOrder(header.headerCrc32);
                            header.dataCrc32   = (uint)IPAddress.NetworkToHostOrder(header.dataCrc32);
                            header.header      = IPAddress.NetworkToHostOrder(header.header);
                            header.dataSize    = IPAddress.NetworkToHostOrder(header.dataSize);
#endif
                            if ((recvBufSz - i) < (header.dataSize + headerSize))
                            {
                                break;
                            }
                            GamePacket packet = new GamePacket();
                            packet.header = header;
                            if (packet.header.dataSize <= 0)
                            {
                                packet.header.dataSize = 0;
                                packet.data            = null;
                            }
                            else
                            {
                                packet.data = new byte[packet.header.dataSize];
                                Buffer.BlockCopy(mRecvBuffer, i + headerSize, packet.data, 0, packet.header.dataSize);
                            }

                            LinkedListNode <GamePacket> node = new LinkedListNode <GamePacket>(packet);
                            mPacketList.AddLast(node);

                            i += headerSize + header.dataSize;
                        }
                    } finally {
                        Marshal.FreeHGlobal(headerBuffer);
                    }

                    recvBufSz -= i;
                    mRecvSize  = recvBufSz;
                    if (recvBufSz > 0)
                    {
                        Buffer.BlockCopy(mRecvBuffer, i, mRecvBuffer, 0, recvBufSz);
                    }

                    ProcessPackets();
                    return(true);
                }
            }
            else
            {
                if (!mAbort)
                {
                    eClientState state = mTcpClient.GetState();
                    if (state == eClientState.eClient_STATE_ABORT)
                    {
                        mAbort = true;

                        // Call Event Abort
                        if (mStateEvents != null)
                        {
                            mStateEvents(state);
                        }

                        return(false);
                    }
                }
            }

            return(true);
        }