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

标签 c++ upnp portforwarding

免责声明: 我在这里仔细阅读了每个类似的主题并进行了谷歌搜索。这些都没有回答我的问题,所以我想积累这个话题的信息。 附言我的英语可能不太好,对此感到抱歉。

我想制作一个 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 之外还有别的东西吗?也许有一个库(我错过了)可以使用?请传播一些光。提前谢谢你。

最佳答案

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

正如@Rook 指出的那样,还有其他建立 P2P 连接的方法,所以 一些其他随机 P2P 软件 工作的事实并不一定意味着该软件知道如何配置您的端口映射。特别是 Skype 并不是真正的 P2P,it depends on huge number of dedicated supernodes .

关于c++ - 自动端口转发(UPnP?)C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380792/

相关文章:

boost::smart_ptr 的 C++ 非侵入式 boost 序列化

c++ - 在 Windows 上编译 libupnp

networking - 从我的 LAN 外部访问 Kafka 代理

c++ - 为什么在尝试使用过剩回调时会出现 SIGSEGV 错误?

c++ - Eigen 模板函数和维度

c++ - 指向函数的指针(有时/总是?)是函数声明符吗?

upnp - 将网络视频流式传输到 Roku

ios - iOS 10 的 DLNA/UPNP 技术

http - 使用 Telnet 通过代理建立隧道 HTTP

kubernetes - 端口转发如何避免MTL