From 1f7b0ad5d49fa99e7cfbb0c9330642e7f3ef2a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 16 Jun 2014 16:42:06 +0200 Subject: [PATCH] time limit the port forwarding if possible --- OpenRA.Game/Network/UPnP.cs | 28 +++++++++++++++++++--------- OpenRA.Game/Server/Server.cs | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/OpenRA.Game/Network/UPnP.cs b/OpenRA.Game/Network/UPnP.cs index 97e61fe5d3..da3f36df18 100644 --- a/OpenRA.Game/Network/UPnP.cs +++ b/OpenRA.Game/Network/UPnP.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -76,28 +76,38 @@ namespace OpenRA.Network } } - public static void ForwardPort() + public static void ForwardPort(int lifetime) { try { - var mapping = new Mapping(Protocol.Tcp, Game.Settings.Server.ExternalPort, Game.Settings.Server.ListenPort); + var mapping = new Mapping(Protocol.Tcp, Game.Settings.Server.ExternalPort, Game.Settings.Server.ListenPort, lifetime); NatDevice.CreatePortMap(mapping); - Log.Write("server", "Create port mapping: protocol={0}, public={1}, private={2}", mapping.Protocol, mapping.PublicPort, mapping.PrivatePort); + Log.Write("server", "Create port mapping: protocol = {0}, public = {1}, private = {2}, lifetime = {3} s", + mapping.Protocol, mapping.PublicPort, mapping.PrivatePort, mapping.Lifetime); } - catch (Exception e) + catch (MappingException e) { - Log.Write("server", "Can not forward ports via UPnP: {0}", e); - Game.Settings.Server.AllowPortForward = false; + if (e.ErrorCode == 725 && lifetime != 0) + { + Log.Write("server", "NAT device answered with OnlyPermanentLeasesSupported. Retrying..."); + ForwardPort(0); + } + else + { + Log.Write("server", "Can not forward ports via UPnP: {0}", e); + Game.Settings.Server.AllowPortForward = false; + } } } - + public static void RemovePortforward() { try { var mapping = new Mapping(Protocol.Tcp, Game.Settings.Server.ExternalPort, Game.Settings.Server.ListenPort); NatDevice.DeletePortMap(mapping); - Log.Write("server", "Remove port mapping: protocol={0}, public={1}, private={2}", mapping.Protocol, mapping.PublicPort, mapping.PrivatePort); + Log.Write("server", "Remove port mapping: protocol = {0}, public = {1}, private = {2}, expiration = {3}", + mapping.Protocol, mapping.PublicPort, mapping.PrivatePort, mapping.Expiration); } catch (Exception e) { diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 92fa9f31a2..9a6105907b 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -110,7 +110,7 @@ namespace OpenRA.Server randomSeed = (int)DateTime.Now.ToBinary(); if (Settings.AllowPortForward) - UPnP.ForwardPort(); + UPnP.ForwardPort(3600); foreach (var trait in modData.Manifest.ServerTraits) serverTraits.Add(modData.ObjectCreator.CreateObject(trait));