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