Exemplo n.º 1
0
        private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber)
        {
            PacketAckPacket ack = new PacketAckPacket();

            ack.Header.Reliable = false;
            ack.Packets         = new PacketAckPacket.PacketsBlock[1];
            ack.Packets[0]      = new PacketAckPacket.PacketsBlock();
            ack.Packets[0].ID   = sequenceNumber;

            byte[] packetData = ack.ToBytes();
            int    length     = packetData.Length;

            UDPPacketBuffer buffer = new UDPPacketBuffer(remoteEndpoint, length);

            buffer.DataLength = length;

            Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);

            AsyncBeginSend(buffer);
        }
Exemplo n.º 2
0
        private void SendACK(uint id)
        {
            try
            {
                PacketAckPacket ack = new PacketAckPacket();
                ack.Packets       = new PacketAckPacket.PacketsBlock[1];
                ack.Packets[0].ID = id;

                ack.Header.Reliable = false;

                // Set the sequence number
                ack.Header.Sequence = ++Sequence;

                Listener.SendTo(ack.ToBytes(), RemoteEndpoint);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Exemplo n.º 3
0
        public virtual void SendAckImmediate(IPEndPoint remoteEndpoint, PacketAckPacket ack)
        {
            byte[] packetData = ack.ToBytes();
            int length = packetData.Length;

            UDPPacketBuffer buffer = new UDPPacketBuffer(remoteEndpoint, length);
            buffer.DataLength = length;

            Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);

            AsyncBeginSend(buffer);
        }
Exemplo n.º 4
0
        private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber)
        {
            PacketAckPacket ack = new PacketAckPacket();
            ack.Header.Reliable = false;
            ack.Packets = new PacketAckPacket.PacketsBlock[1];
            ack.Packets[0] = new PacketAckPacket.PacketsBlock();
            ack.Packets[0].ID = sequenceNumber;

            byte[] packetData = ack.ToBytes();
            int length = packetData.Length;

            UDPPacketBuffer buffer = new UDPPacketBuffer(remoteEndpoint, length);
            buffer.DataLength = length;

            Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);

            //            AsyncBeginSend(buffer);
            SyncSend(buffer);

        }
Exemplo n.º 5
0
        /// <summary>
        /// Add a new client circuit.
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="epSender"></param>
        /// <param name="epProxy"></param>
        protected virtual void AddNewClient(UseCircuitCodePacket useCircuit, EndPoint epSender, EndPoint epProxy)
        {
            //Slave regions don't accept new clients
            if (m_localScene.RegionStatus != RegionStatus.SlaveScene)
            {
                AuthenticateResponse sessionInfo;
                bool isNewCircuit = false;

                if (!m_packetServer.IsClientAuthorized(useCircuit, m_circuitManager, out sessionInfo))
                {
                    m_log.WarnFormat(
                        "[CONNECTION FAILURE]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
                        useCircuit.CircuitCode.ID, useCircuit.CircuitCode.Code, epSender);

                    return;
                }

                lock (clientCircuits)
                {
                    if (!clientCircuits.ContainsKey(epSender))
                    {
                        clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
                        isNewCircuit = true;
                    }
                }

                if (isNewCircuit)
                {
                    // This doesn't need locking as it's synchronized data
                    clientCircuits_reverse[useCircuit.CircuitCode.Code] = epSender;

                    lock (proxyCircuits)
                    {
                        proxyCircuits[useCircuit.CircuitCode.Code] = epProxy;
                    }

                    m_packetServer.AddNewClient(epSender, useCircuit, m_assetCache, sessionInfo, epProxy);

                    //m_log.DebugFormat(
                    //    "[CONNECTION SUCCESS]: Incoming client {0} (circuit code {1}) received and authenticated for {2}",
                    //    useCircuit.CircuitCode.ID, useCircuit.CircuitCode.Code, m_localScene.RegionInfo.RegionName);
                }
            }

            // Ack the UseCircuitCode packet
            PacketAckPacket ack_it = (PacketAckPacket)PacketPool.Instance.GetPacket(PacketType.PacketAck);

            // TODO: don't create new blocks if recycling an old packet
            ack_it.Packets       = new PacketAckPacket.PacketsBlock[1];
            ack_it.Packets[0]    = new PacketAckPacket.PacketsBlock();
            ack_it.Packets[0].ID = useCircuit.Header.Sequence;
            // ((useCircuit.Header.Sequence < uint.MaxValue) ? useCircuit.Header.Sequence : 0) is just a failsafe to ensure that we don't overflow.
            ack_it.Header.Sequence = ((useCircuit.Header.Sequence < uint.MaxValue) ? useCircuit.Header.Sequence : 0) + 1;
            ack_it.Header.Reliable = false;

            byte[] ackmsg = ack_it.ToBytes();

            // Need some extra space in case we need to add proxy
            // information to the message later
            byte[] msg = new byte[4096];
            Buffer.BlockCopy(ackmsg, 0, msg, 0, ackmsg.Length);

            SendPacketTo(msg, ackmsg.Length, SocketFlags.None, useCircuit.CircuitCode.Code);

            PacketPool.Instance.ReturnPacket(useCircuit);
        }
        private void SendACK(uint id)
        {
            try
            {
                PacketAckPacket ack = new PacketAckPacket();
                ack.Packets = new PacketAckPacket.PacketsBlock[1];
                ack.Packets[0].ID = id;

                ack.Header.Reliable = false;

                // Set the sequence number
                ack.Header.Sequence = ++Sequence;

                Listener.SendTo(ack.ToBytes(), RemoteEndpoint);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Exemplo n.º 7
0
        private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber)
        {
            PacketAckPacket ack = new PacketAckPacket();
            ack.Header.Reliable = false;
            ack.Packets = new PacketAckPacket.PacketsBlock[1];
            ack.Packets[0] = new PacketAckPacket.PacketsBlock();
            ack.Packets[0].ID = sequenceNumber;

            byte[] packetData = ack.ToBytes();
            int length = packetData.Length;

            OutgoingPacket outgoingPacket = new OutgoingPacket(null, packetData, 0, length, 
                remoteEndpoint, false, PacketType.PacketAck);

            AsyncBeginSend(outgoingPacket);
        }
        private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber)
        {
            PacketAckPacket ack = new PacketAckPacket
                                      {Header = {Reliable = false}, Packets = new PacketAckPacket.PacketsBlock[1]};
            ack.Packets[0] = new PacketAckPacket.PacketsBlock {ID = sequenceNumber};

            byte[] packetData = ack.ToBytes();
            int length = packetData.Length;

            UDPPacketBuffer buffer = new UDPPacketBuffer(remoteEndpoint, length) {DataLength = length};

            Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);

            SyncSend(buffer);
        }