Example #1
0
        public void Release()
        {
            CloseSocket();

            _CachedSendMessageQueue.Clear();
            _ConEventArgsQueue.Clear();

            _BufferBlock = null;

            if (_SyncSendMessageThread != null)
            {
                //_SyncSendMessageThread.Interrupt();
                _SyncSendMessageThread.Abort();
                _SyncSendMessageThread = null;
            }

            if (_ConnectTimer != null)
            {
                _ConnectTimer.Stop();
                _ConnectTimer.Close();
            }

            _ServiceSocket = null;
            _DataToken     = null;
        }
Example #2
0
        private static int HandlePrefix(byte[] buffer, DataToken dataToken, int remaimingBytesToProcess)
        {
            int headerLen = 4 - dataToken.PrefixDoneNum;
            var offset    = dataToken.BufferSkipOffset;

            if (remaimingBytesToProcess >= headerLen)
            {
                for (int i = 0; i < headerLen; i++)
                {
                    dataToken.ByteArrayForPrefix[dataToken.PrefixDoneNum + i] = buffer[offset + i];
                }
                remaimingBytesToProcess     = remaimingBytesToProcess - headerLen;
                dataToken.PrefixDoneNum     = 4;
                dataToken.MessageLength     = BitConverter.ToInt32(dataToken.ByteArrayForPrefix, 0);
                dataToken.BufferSkipOffset += headerLen;
            }
            else
            {
                for (int i = 0; i < remaimingBytesToProcess; i++)
                {
                    dataToken.ByteArrayForPrefix[dataToken.PrefixDoneNum + i] = buffer[offset + i];
                }
                dataToken.PrefixDoneNum += remaimingBytesToProcess;
                remaimingBytesToProcess  = 0;
            }
            return(remaimingBytesToProcess);
        }
Example #3
0
        private static int HandleMessage(byte[] buffer, DataToken dataToken, int remaimingBytesToProcess)
        {
            int notCopyTypes = 0;

            if (dataToken.MessageDoneNum == 0)
            {
                dataToken.ByteArrayForMessage = new byte[dataToken.MessageLength];
            }
            var offset = dataToken.BufferSkipOffset;

            if (remaimingBytesToProcess + dataToken.MessageDoneNum > dataToken.MessageLength)
            {
                int needCopyBytes = dataToken.MessageLength - dataToken.MessageDoneNum; //需要复制的byte数
                notCopyTypes = remaimingBytesToProcess - needCopyBytes;                 //剩余的byte数
                Buffer.BlockCopy(buffer, offset, dataToken.ByteArrayForMessage, dataToken.MessageDoneNum, needCopyBytes);
                dataToken.MessageDoneNum    = dataToken.MessageLength;
                dataToken.BufferSkipOffset += needCopyBytes;
            }
            else
            {
                Buffer.BlockCopy(buffer, offset, dataToken.ByteArrayForMessage, dataToken.MessageDoneNum, remaimingBytesToProcess);
                dataToken.MessageDoneNum += remaimingBytesToProcess;
            }
            return(notCopyTypes);
        }
Example #4
0
        public static bool TryReadMessage(DataToken dataToken, byte[] buffer, int length, out List <byte[]> messageList)
        {
            int  remainingBytesToProcess = length;
            bool needPostAnother         = true;

            messageList = null;
            _MessageList.Clear();

            do
            {
                if (dataToken.PrefixDoneNum < 4)
                {
                    remainingBytesToProcess = HandlePrefix(buffer, dataToken, remainingBytesToProcess);
                    if (dataToken.PrefixDoneNum == 4 && (dataToken.MessageLength > 10 * 1024 * 1024 || dataToken.MessageLength < 0))
                    {
                        //包长度出错
                        needPostAnother = false;
                        break;
                    }
                    if (remainingBytesToProcess == 0)
                    {
                        break;
                    }
                }
                else
                {
                    // TODO: remainingBytesToProcess = HandlePrtcId();
                }

                remainingBytesToProcess = HandleMessage(buffer, dataToken, remainingBytesToProcess);
                if (dataToken.MessageDoneNum == dataToken.MessageLength)//获得完整消息包
                {
                    _MessageList.Add(dataToken.ByteArrayForMessage);
                    if (remainingBytesToProcess != 0)
                    {
                        dataToken.Reset(false);
                    }
                }
            }while (remainingBytesToProcess != 0);

            messageList = _MessageList;

            if (needPostAnother)
            {
                //如果刚好处理完完整的包,则dataToken完全重置,否则仅重置偏移量
                if (dataToken.PrefixDoneNum == 4 && dataToken.MessageDoneNum == dataToken.MessageLength)
                {
                    dataToken.Reset(true);
                }
                else
                {
                    dataToken.BufferSkipOffset = 0;
                }
            }
            return(needPostAnother);
        }
Example #5
0
 private static int HandlePrtcId(byte[] buffer, DataToken dataToken, int remaimingBytesToProcess)
 {
     return(remaimingBytesToProcess);
 }