问题 自动端口转发(UPnP?)C ++


放弃我在这里仔细阅读了每个类似的主题并进行了谷歌搜索。没有回答我的问题,所以我想在这个主题中积累信息。 附:我的英语可能不太好,抱歉。

我想制作一个p2p应用程序(游戏)。显然很多人会在一台机器上运行这个程序,这台机器是本地网络的一部分,有一个互联网接入点(路由器),如果没有端口转发,应用程序就无法工作。所以,我做了一项研究,发现我可以使用UPnP进行自动端口转发。编写微测试代码以访问端口转发:

bool CPortController::Init() {


  HRESULT result = CoInitialize(NULL); // Must be NULL
  if (FAILED(result)) return false;

  result = CoCreateInstance(__uuidof(UPnPNAT), NULL, CLSCTX_ALL, __uuidof(IUPnPNAT), (void **)&Nat);
  if (FAILED(result) || !Nat) return false;

  result = Nat->get_StaticPortMappingCollection(&Collection); 
  if (FAILED(result) || !Collection) return false; // Here I'm getting S_OK as result, but Collection is always == 0

  return true;
}

搜索到的原因(见代码注释)发现我发现: 1.旧系统(不,我有Win7更新) 2.路由器可能没有UPnP功能,或者可能未启用 3.防火墙可能阻塞了UPnP所需的TCP端口2869或UDP端口1900

可悲的是,我没有访问路由器来检查最后2,但它并不重要,因为Skype和uTorrent(两个p2p)完美运行。我需要找到使用我的应用程序自动执行相同技巧和转发端口的方法,而无需用户做任何事情。

关于UPnP库: 我发现很少有UPnP库(PlatinumUPnP,miniUPnP),但他们似乎有很多代码用于寻找智能设备并将它们组合在一起......呃......我不确定我是否需要这个来完成我的任务和我无法找到一段代码(不使用上面列出的那些WinUPnPAPI)进行自动端口转发。

我现在有点迷失了。谁能告诉我继续研究的方向?也许除了UPnP还有别的东西吗?也许有一个lib(我错过了)使用?请点亮一些光。先谢谢你。


8886
2017-11-14 14:32


起源

Skype通过使用调用的技巧避免了对UPnP的需求 NAT打孔 这需要公共服务器的合作。这意味着初始连接建立阶段不是P2P,尽管后续通信是。 - Rook
@Rook,谢谢你让我知道HolePunching。我读过几篇文章,看起来就像我需要的那样。可悲的是,无法将您的评论标记为“已接受的答案”,因为它已发布为评论,但它完全值得!谢谢 :) - JacksonRR
好吧,我不打算回答,因为它根本没有谈论uPnP。帕维尔的答案在这方面更有用! - Rook


答案:


DeviceSpy 从 UPnP开发人员工具 并搜索您的网络 InternetGatewayDevice。如果没有,则您的路由器不支持UPnP或禁用它。如果有,请检查 WANIPConnection 服务。请注意,从InternetGatewayDevice v2(自2010年起)起,您不能在UPnP上设置静态端口映射(租约时间0)。

正如@Rook指出的,还有其他方法可以建立P2P连接,所以事实就是这样 其他一些随机的P2P软件 工作,并不一定意味着软件知道如何配置端口映射。 Skype尤其不是P2P, 它取决于大量的专用超节点


11
2017-11-14 22:35



非常感谢你。 (对不起,11声誉不允许投票给你,但是你的评论非常无聊,谢谢) - JacksonRR