示例#1
0
        public UdpChannel(IChannelOption channelOption, ILogger logger, NetStatistic statistic, ushort relaySessionId)
            : base(channelOption, logger, statistic)
        {
            _relaySessionId = relaySessionId;
            _sendBuffer = new byte[NetPacket.MaxUdpPacketSize];

            _fragments = new PacketFragments();

            _pingPacket = new NetPacket(PacketProperty.Ping, 0);
            _pingPacket.DeliveryMethod = DeliveryMethod.Unreliable;
            _pingPacket.Sequence = 1;

            _pongPacket = new NetPacket(PacketProperty.Pong, 0);
            _pongPacket.DeliveryMethod = DeliveryMethod.Unreliable;

            _pingTimer = new Stopwatch();

            _udpChannels = new ChannelBase[(int)DeliveryMethod.Max];

            _udpChannels[(int)DeliveryMethod.Unreliable] = new UnreliableChannel(channelOption, logger, statistic, this);
            _udpChannels[(int)DeliveryMethod.ReliableOrdered] = new ReliableChannel(channelOption, logger, statistic, this, true);
            _udpChannels[(int)DeliveryMethod.ReliableUnordered] = new ReliableChannel(channelOption, logger, statistic, this, false);
            _udpChannels[(int)DeliveryMethod.ReliableSequenced] = new SequencedChannel(channelOption, logger, statistic, this, true);
            _udpChannels[(int)DeliveryMethod.Sequenced] = new SequencedChannel(channelOption, logger, statistic, this, false);
        }
示例#2
0
        public ReliableChannel(IChannelOption channelOption, ILogger logger, NetStatistic statistic, UdpChannel channel, bool ordered)
            : base(channelOption, logger, statistic)
        {
            _udpChannel = channel;
            _sendQueue  = new Queue <NetPacket>(WindowSize);

            _pendingPackets = new ReliableSendInfo[WindowSize];
            for (int i = 0; i < _pendingPackets.Length; i++)
            {
                _pendingPackets[i] = new ReliableSendInfo();
            }

            _ordered = ordered;

            if (_ordered)
            {
                _receivedPackets = new NetPacket[WindowSize];
                _deliveryMethod  = DeliveryMethod.ReliableOrdered;
            }
            else
            {
                _earlyReceived  = new bool[WindowSize];
                _deliveryMethod = DeliveryMethod.ReliableUnordered;
            }

            int bytesCount = (WindowSize - 1) / BitsInByte + 2;

            _ackPacket = new NetPacket(PacketProperty.Ack, bytesCount);
            _ackPacket.DeliveryMethod = _deliveryMethod;
        }
示例#3
0
        public SequencedChannel(IChannelOption channelOption, ILogger logger, NetStatistic statistic, UdpChannel udpChannel, bool reliable)
            : base(channelOption, logger, statistic)
        {
            _sendQueue  = new Queue <NetPacket>(64);
            _udpChannel = udpChannel;
            _reliable   = reliable;

            if (_reliable)
            {
                _deliveryMethod = DeliveryMethod.ReliableSequenced;

                _ackPacket = new NetPacket(PacketProperty.Ack, 0);
                _ackPacket.DeliveryMethod = _deliveryMethod;
            }
            else
            {
                _deliveryMethod = DeliveryMethod.Sequenced;
            }
        }
示例#4
0
        public TcpChannel(IChannelOption channelOption, ILogger logger, NetStatistic statistic)
            : base(channelOption, logger, statistic)
        {
            _asyncEventArgsSend            = new SocketAsyncEventArgs();
            _asyncEventArgsSend.Completed += OnIoCompleted;
            _asyncEventArgsSend.UserToken  = this;

            _receivedBuffer = new byte[NetPacket.MaxTcpPacketSize];

            _asyncEventArgsReceive            = new SocketAsyncEventArgs();
            _asyncEventArgsReceive.Completed += OnIoCompleted;
            _asyncEventArgsReceive.UserToken  = this;
            _asyncEventArgsReceive.SetBuffer(_receivedBuffer, 0, _receivedBuffer.Length);

            _sendedList       = new List <NetPacket>();
            _sendWaitQueue    = new List <NetPacket>();
            _sendedBufferList = new SendingQueue();

            _receivedSize = 0;
        }
示例#5
0
 public UnreliableChannel(IChannelOption channelOption, ILogger logger, NetStatistic statistic, UdpChannel channel)
     : base(channelOption, logger, statistic)
 {
     _udpChannel = channel;
 }
示例#6
0
 public ChannelBase(IChannelOption channelOption, ILogger logger, NetStatistic statistic)
 {
     _channelOption = channelOption;
     _logger        = logger;
     _statistic     = statistic;
 }