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

C++ 自动端口转发(UPnP?)C++;,c++,upnp,portforwarding,C++,Upnp,Portforwarding,免责声明: 我仔细阅读了这里的每一个类似主题,并在谷歌上搜索了一下。没有人回答了我的问题,所以我想积累这个主题的信息。 另外,我的英语可能不太好,很抱歉 我想做一个p2p应用程序(游戏)。显然,很多人会在一台机器上运行这个程序,这台机器是本地网络的一部分,只有一个互联网接入点(路由器),如果没有端口转发,应用程序将无法工作。所以,我做了一项研究,发现我可以用UPnP进行自动端口转发。微测试代码已写入访问端口转发: bool CPortController::Init() { HRESUL

免责声明: 我仔细阅读了这里的每一个类似主题,并在谷歌上搜索了一下。没有人回答了我的问题,所以我想积累这个主题的信息。 另外,我的英语可能不太好,很抱歉

我想做一个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库(Platinumuppnp、miniUPnP),但它们似乎有太多面向查找智能设备并将它们组合在一起的代码。。。嗯。。。我不确定我是否需要这个来完成我的任务,并且我找不到一段代码(没有使用上面列出的WinUPnPAPI)用于自动端口转发


我现在有点迷路了。谁能告诉我继续研究的方向吗?也许除了UPnP还有别的东西?也许有一个lib(我错过了)可以使用?请洒点光。提前感谢。

从运行DeviceSpy并在您的网络中搜索
InternetGatewayDevice
。如果没有,则表示您的路由器不支持UPnP或已将其禁用。如果有,请检查
WANIPConnection
服务。请注意,从InternetGatewayDevice v2(自2010年起)起,不允许通过UPnP设置静态端口映射(租用时间0)


正如@Rook所指出的,还有其他方法可以建立P2P连接,因此,其他一些随机P2P软件工作的事实并不一定意味着该软件知道如何配置端口映射。Skype尤其不是真正的P2P。

Skype通过使用一种称为的技巧来避免UPnP的需要,这种技巧需要公共服务器的合作。这意味着初始连接设置阶段不是P2P,尽管后续通信是。@Rook,谢谢你让我知道HolePunching。我读过几篇文章,它看起来正是我需要的。可悲的是,不能将你的评论标记为“接受答案”,因为它是作为评论发布的,但它完全值得!谢谢:)好吧,我不打算回答这个问题,因为它根本没有提到uPnP。帕维尔的答案在这方面更有用!非常感谢你。(对不起,11声誉不允许投票支持你,但你的评论很有说服力,谢谢)