Example #1
0
        /// <summary>
        /// 尝试读取
        /// </summary>
        /// <param name="tunnelPacket"></param>
        /// <returns></returns>
        /// <exception cref="InvalidOperationException"></exception>
        public bool Read()
        {
            if (sourceOffset == sourceSize)
            {
                return(false);
            }

            if (headerSize < TunnelPacket.HeaderSize)
            {
                for (; headerSize < TunnelPacket.HeaderSize && sourceOffset < sourceSize; headerSize++)
                {
                    headerBuffer[headerSize] = source[sourceOffset++];
                }

                if (headerSize < TunnelPacket.HeaderSize)
                {
                    return(false);   // Header 不足
                }

                PacketHeaderSerializer.Deserialize(headerBuffer, tunnelPacket);

                if (tunnelPacket.Magic != TunnelPacket.MagicValue || tunnelPacket.Version != TunnelPacket.VersionValue)
                {
                    ((IPacket)tunnelPacket).Source.Interrupte();   // 中断无效报文连接
                }
            }

            var dataSize = Math.Min(sourceSize - sourceOffset, ((IPacket)tunnelPacket).Size - packetBufferSize);

            Array.Copy(source, sourceOffset, ((IPacket)tunnelPacket).Buffer, packetBufferSize, dataSize);
            packetBufferSize += dataSize;
            sourceOffset     += dataSize;

            if (packetBufferSize == ((IPacket)tunnelPacket).Size)
            {
                // 重置
                headerSize       = 0;
                packetBufferSize = 0;
                return(true);
            }
            return(false);
        }
Example #2
0
        public void Write <TState>(IPacket packet, IOCompleteCallback <TState> callback, TState state)
        {
            if (!transPacket.Disposed)
            {
                throw new InvalidOperationException("trans is not completed");
            }

            this.outputPacket = packet;
            this.callback     = callback;
            this.state        = state;

            var packetType = !(packet is TunnelPacket) ? (int)TunnelPacketType.Data : (int)((TunnelPacket)packet).Type;

            PacketHeaderSerializer.Serialize(packetType, packet.Size, transPacket.Buffer);

            var dataSize = Math.Min(BufferPacket.BufferSize - TunnelPacket.HeaderSize, outputPacket.Size);

            transPacket.Relive(dataSize + TunnelPacket.HeaderSize);
            if (dataSize > 0) // 具备内容
            {
                Array.Copy(outputPacket.Buffer, 0, transPacket.Buffer, TunnelPacket.HeaderSize, dataSize);
            }
            tunnelPipeline.TransPipeline.Output(transPacket, CompleteTransOutput <TState>, dataSize);
        }