【发布时间】:2016-11-02 17:19:52
【问题描述】:
我最近一直在尝试为我的游戏设置端口映射。这是为了让其中一名玩家成为主持人。为此,我需要玩家打开 7777 端口。
如果已经有匹配,它会简单地加入它。如果它没有找到空匹配,它将简单地创建一个。如果它无法制作一个,它将等到有人制作一个并加入它。
因此,我需要能够使用 UPnP 之类的东西来映射我的端口。我还需要能够捕获错误以查看是继续创建匹配还是只是等待一个匹配并加入。
我目前在使用 .NET 2.0 的 Unity 游戏引擎中工作。这让我非常有限,因为 Open.NAT 不兼容。我尝试了 Mono.NAT,但无法正常工作。
有人对我应该如何处理这个问题有任何建议吗?使用哪些库,甚至可能为我提供代码 sn-ps 以帮助我入门。
谢谢,TwoTen。
Edit1:当前的 Mono.NAT 代码如下所示:
private void DeviceFound(object sender, DeviceEventArgs args)
{
Debug.Log("1");
INatDevice device = args.Device;
Debug.Log("2");
Mapping map = new Mapping(Protocol.Tcp, 6699, 6699);
Debug.Log("3");
device.CreatePortMap(map);
Debug.Log("4");
int test = device.GetAllMappings().Length;
Debug.Log(test);
foreach (Mapping portMap in device.GetAllMappings())
{
Debug.Log("5");
Debug.Log(portMap.ToString());
}
}
private void DeviceLost(object sender, DeviceEventArgs args)
{
INatDevice device = args.Device;
Mapping map = new Mapping(Protocol.Tcp, 6699, 6699);
device.DeletePortMap(map);
}
I 最后调用的调试语句是编号 4。I 端口没有打开,也没有抛出异常。 我做错了什么?
另外,在我的启动函数中,我称之为:
NatUtility.DeviceFound += DeviceFound;
NatUtility.DeviceLost += DeviceLost;
NatUtility.StartDiscovery();
【问题讨论】:
-
"我尝试了 Mono.NAT,但我无法让它工作"请将代码发布到那里。这对我有用。我需要看看你在做什么。另外,你怎么知道它不起作用?
-
我更新了帖子以包含我的代码。
-
用
Debug.Log(test);替换Debug.Log("4++"+test);然后再次使用日志更新问题。另外,你把 Mono.NAT DLL 放在哪里了? -
我的 mono.nat dll 在我的 Asset 文件夹中。 Debug.Log("4++" + test) 永远不会被调用。只有 1、2、3 和 4 被跟注。目前我正在使用 CanYouSeeMe.org 来验证端口是否已正确添加。
-
这似乎是对的。您的代码正是我正在使用的。 NAT 的问题是启动它在某些路由器上有效,而在其他路由器上无效。有时,由于防火墙,它不起作用,有时它不起作用,因为您的路由器上禁用了 UPNP。确保您的编辑器没有防火墙阻止它。此外,如果您可以访问您的路由器,请登录并检查 UPNP 是否已禁用。
标签: networking unity3d mono .net-2.0 upnp