Ejemplo n.º 1
0
        private static void HandleMessage(IMasterServerMessageBase message, NetIncomingMessage netMsg, NetPeer peer)
        {
            if (BannedIpsRetriever.IsBanned(netMsg.SenderEndPoint))
            {
                LunaLog.Debug($"Ignoring BANNED ip: {netMsg.SenderEndPoint}");
                return;
            }

            try
            {
                switch ((message?.Data as MsBaseMsgData)?.MasterServerMessageSubType)
                {
                case MasterServerMessageSubType.RegisterServer:
                    RegisterServer(message, netMsg);
                    break;

                case MasterServerMessageSubType.RequestServers:
                    LunaLog.Normal($"LIST REQUEST from: {netMsg.SenderEndPoint}");
                    SendServerLists(netMsg, peer);
                    break;

                case MasterServerMessageSubType.Introduction:
                    var msgData = (MsIntroductionMsgData)message.Data;
                    if (ServerDictionary.TryGetValue(msgData.Id, out var server))
                    {
                        LunaLog.Normal($"INTRODUCTION request from: {netMsg.SenderEndPoint} to server: {server.ExternalEndpoint}");
                        peer.Introduce(server.InternalEndpoint, server.ExternalEndpoint,
                                       msgData.InternalEndpoint, // client internal
                                       netMsg.SenderEndPoint,    // client external
                                       msgData.Token);           // request token
                    }
                    else
                    {
                        LunaLog.Warning($"Client {netMsg.SenderEndPoint} requested introduction to non listed host!");
                    }
                    break;
                }
            }
            catch (Exception e)
            {
                LunaLog.Error($"Error handling message. Details: {e}");
            }
        }
Ejemplo n.º 2
0
        private static void RemoveExpiredServers()
        {
            Task.Run(async() =>
            {
                while (RunServer)
                {
                    var serversIdsToRemove = ServerDictionary
                                             .Where(s => LunaNetworkTime.UtcNow.Ticks - s.Value.LastRegisterTime >
                                                    TimeSpan.FromMilliseconds(ServerMsTimeout).Ticks ||
                                                    BannedIpsRetriever.IsBanned(s.Value.ExternalEndpoint))
                                             .ToArray();

                    foreach (var serverId in serversIdsToRemove)
                    {
                        LunaLog.Normal($"REMOVING SERVER: {serverId.Value.ExternalEndpoint}");
                        ServerDictionary.TryRemove(serverId.Key, out _);
                    }

                    await Task.Delay(ServerRemoveMsCheckInterval);
                }
            });
        }
Ejemplo n.º 3
0
        private static void HandleMessage(IMasterServerMessageBase message, NetIncomingMessage netMsg, NetPeer peer)
        {
            if (BannedIpsRetriever.IsBanned(netMsg.SenderEndPoint))
            {
                LunaLog.Debug($"Ignoring BANNED ip: {netMsg.SenderEndPoint}");
                return;
            }

            try
            {
                switch ((message?.Data as MsBaseMsgData)?.MasterServerMessageSubType)
                {
                case MasterServerMessageSubType.RegisterServer:
                    RegisterServer(message, netMsg);
                    break;

                case MasterServerMessageSubType.RequestServers:
                    LunaLog.Normal($"LIST REQUEST from: {netMsg.SenderEndPoint}");
                    SendServerLists(netMsg, peer);
                    break;

                case MasterServerMessageSubType.Introduction:
                    var msgData = (MsIntroductionMsgData)message.Data;
                    if (ServerDictionary.TryGetValue(msgData.Id, out var server))
                    {
                        _ = Task.Run(() =>
                        {
                            if (!server.InternalEndpoint6.Address.Equals(IPAddress.IPv6Loopback) &&
                                !server.InternalEndpoint6.Address.Equals(IPAddress.IPv6Loopback))
                            {
                                // Both client and server are listening on IPv6, try an IPv6 firewall punchthrough
                                // This also triggers a first punchthrough on IPv4 with the public addresses
                                LunaLog.Normal(
                                    $"INTRODUCTION request from: {msgData.InternalEndpoint6} to server: {server.InternalEndpoint6}");
                                peer.Introduce(server.InternalEndpoint6, server.ExternalEndpoint,
                                               msgData.InternalEndpoint6, // client internal
                                               netMsg.SenderEndPoint,     // client external
                                               msgData.Token);            // request token

                                // Give the first introduction attempt some time
                                Thread.Sleep(50);
                            }

                            LunaLog.Normal(
                                $"INTRODUCTION request from: {netMsg.SenderEndPoint} to server: {server.ExternalEndpoint}");
                            peer.Introduce(server.InternalEndpoint, server.ExternalEndpoint,
                                           msgData.InternalEndpoint, // client internal
                                           netMsg.SenderEndPoint,    // client external
                                           msgData.Token);           // request token
                        });
                    }
                    else
                    {
                        LunaLog.Warning($"Client {netMsg.SenderEndPoint} requested introduction to non listed host!");
                    }
                    break;
                }
            }
            catch (Exception e)
            {
                LunaLog.Error($"Error handling message. Details: {e}");
            }
        }