7

我正在尝试在我的 c# 应用程序中添加新的静态端口映射。因为我的应用程序作为服务器运行,我希望它在端口 8000 上侦听。

NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
NATUPNPLib.IStaticPortMappingCollection mappings = upnpnat.StaticPortMappingCollection;
mappings.Add(8000, "TCP", 8000, "192.168.1.100", true, "Local Web Server");

但它不起作用!,例外情况如下:

你调用的对象是空的。

有人可以帮助我吗?

这就是我正在做的事情:http: //pietschsoft.com/post/2009/02/05/NET-Framework-Communicate-through-NAT-Router-via-UPnP.aspx

4

3 回答 3

3

您需要将映射设置为新实例:

例如:

var mappings = new List<Mapping>();

然后你可以调用:

mappings.Add(8000, "TCP", 8000, "192.168.1.100", true, "Local Web Server");

从您的编辑:

upnpnat.StaticPortMappingCollection; // this is your problem.  

该集合返回为空。因此,您不能添加到集合中。

您可能必须这样做:

NATUPNPLib.IStaticPortMappingCollection mappings = new StaticPortMappingCollection();

来自 Codesleuth 的评论:

我相信答案是他的路由器没有配置为 UPnP 网关,或者他没有权限。如果其中任何一种情况为真,则 StaticPortMappingCollection 为空。我建议您将其编辑到您的答案中,因为无论如何您都有正确的错误原因。首先检查 null 是处理错误的唯一方法

于 2013-02-13T15:09:28.433 回答
1

如果没有更多代码,我们将能够提供帮助,但如果异常在您提供的行上,则表示该异常为mappingsnull 且未设置。

检查该行之前的代码,看看您是否真的在创建和设置mappings变量。

根据您的评论,返回的对象upnpnat.StaticPortMappingCollection是空的。检查文档以确保您正确初始化它。

于 2013-02-13T15:09:37.570 回答
1

仅基于您的错误消息,这就是我们所拥有的;

var mappings = new List<Mapping>();
mappings.Add(8000, "TCP", 8000, "192.168.1.100", true, "Local Web Server");

编辑后,可能使用like;

NATUPNPLib.IStaticPortMappingCollection mappings = new StaticPortMappingCollection();

好像忘记使用了()

于 2013-02-13T15:11:02.783 回答