/// <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); }
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); }