免责声明: 我已经仔细阅读了这里的所有类似主题并进行了谷歌搜索。没有人回答我的问题,所以我想在这个主题上积累信息。PS我的英语可能不太好,对此感到抱歉。
我想做一个 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之外还有别的东西吗?也许有一个库(我错过了)可以使用?请传播一些光。先感谢您。