Пример #1
0
    /// <summary>
    /// Raises the recv thread event.
    /// </summary>
    public void             OnRecvThread()
    {
        NetTcpStateObject netState = new NetTcpStateObject();

        netState.workSocket = socket;

        try{
            while (true)
            {
                if (!Connected())
                {
                    break;
                }

                int nReadBytes = socket.Receive(netState.buffer,
                                                netState.writeOffset, NetTcpStateObject.BufferSize - netState.writeOffset, SocketFlags.None);
                if (nReadBytes <= 0)
                {
                    break;
                }

                nReadBytes += netState.writeOffset;

                int nIndex      = netState.readOffset;
                int nPacketSize = 0;

                while (nIndex < nReadBytes)
                {
                    int nOffset = netState.readOffset;
                    nPacketSize = BitConverter.ToInt32(netState.buffer, nOffset);

                    if (nIndex + sizeof(int) + nPacketSize <= nReadBytes)
                    {
                        nOffset += sizeof(int);

                        INetPacket packet = new INetPacket();
                        packet.Set(nPacketSize, netState.buffer, nOffset);

                        if (packet.Type != 0)
                        {
                            PostPacket(packet);
                        }

                        netState.readOffset += (sizeof(int) + nPacketSize);
                    }

                    nIndex += (sizeof(int) + nPacketSize);
                }

                if (nIndex == nReadBytes)
                {
                    netState.readOffset  = 0;
                    netState.writeOffset = 0;
                }
                else
                {
                    if (netState.readOffset + nPacketSize > NetTcpStateObject.BufferSize)
                    {
                        byte[] newBuffer = new byte[NetTcpStateObject.BufferSize];

                        int bytesCopy = nReadBytes - netState.readOffset;
                        Buffer.BlockCopy(netState.buffer,
                                         netState.readOffset, newBuffer, 0, bytesCopy);

                        netState.buffer      = newBuffer;
                        netState.readOffset  = 0;
                        netState.writeOffset = bytesCopy;

                                                #if UNITY_EDITOR
                        UnityEngine.Debug.Log(string.Format("Receive create new buffer readOffset({0}) packetSize({1}) writeOffset({2})",
                                                            netState.readOffset, nPacketSize, netState.writeOffset));
                                                #endif
                    }
                    else
                    {
                        netState.writeOffset = nReadBytes;
                    }
                }
            }
        } catch (Exception e) {
                        #if UNITY_EDITOR
            UnityEngine.Debug.LogError(e.Message);
                        #endif

            PostPacket(
                new INetPacket(PacketType.SOCKET_DISCONNECT)
                );
        }

        // close net recv thread
        Close();

        recvThread.Abort();
    }