private void ReadBody(byte[] bytes, int offset, int limit)
    {
        int length = pkgLength + HeadLength - bufferOffset;

        if ((offset + length) <= limit)
        {
            WriteBytes(bytes, offset, length, bufferOffset, buffer);
            offset += length;

            //Invoke the protocol api to handle the message
            this.messageProcesser.Invoke(buffer);
            this.bufferOffset = 0;
            this.pkgLength    = 0;

            if (this.enTransportState != enTransportState.closed)
            {
                this.enTransportState = enTransportState.readHead;
            }
            if (offset < limit)
            {
                ProcessBytes(bytes, offset, limit);
            }
        }
        else
        {
            WriteBytes(bytes, offset, limit - offset, bufferOffset, buffer);
            bufferOffset         += limit - offset;
            this.enTransportState = enTransportState.readBody;
        }
    }
    private bool ReadHead(byte[] bytes, int offset, int limit)
    {
        int length  = limit - offset;
        int headNum = HeadLength - bufferOffset;

        if (length >= headNum)
        {
            //Write head buffer
            WriteBytes(bytes, offset, headNum, bufferOffset, headBuffer);
            //Get package length
            pkgLength = (headBuffer[1] << 16) + (headBuffer[2] << 8) + headBuffer[3];

            //Init message buffer
            buffer = new byte[HeadLength + pkgLength];
            WriteBytes(headBuffer, 0, HeadLength, buffer);
            offset               += headNum;
            bufferOffset          = HeadLength;
            this.enTransportState = enTransportState.readBody;

            if (offset <= limit)
            {
                ProcessBytes(bytes, offset, limit);
            }
            return(true);
        }
        else
        {
            WriteBytes(bytes, offset, length, bufferOffset, headBuffer);
            bufferOffset += length;
            return(false);
        }
    }
 internal void Close()
 {
     this.enTransportState = enTransportState.closed;
 }
 public Transporter(Socket socket, Action <byte[]> processer)
 {
     this.socket           = socket;
     this.messageProcesser = processer;
     enTransportState      = enTransportState.readHead;
 }