免责声明:我仔细阅读了这里的所有类似主题并进行了谷歌搜索。其中没有一个回答了我的问题,因此我想在这个主题中积累信息。 附注:我的英语可能不太好,对此表示抱歉。
我想制作一个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遗憾的是,我无法访问路由器以检查最后两个原因,但这并不重要,因为Skype和uTorrent(均为P2P)都可以正常工作。 我需要找到一种方法,在不要求用户做任何事情的情况下使用我的应用程序自动进行端口转发。
关于UPnP库: 我找到了几个UPnP库(PlatinumUPnP,miniUPnP),但它们似乎有很多面向查找智能设备并将它们组合在一起的代码……嗯……我不确定我需要这个来完成我的任务,并且我找不到一段代码(不使用我上面列出的那些WinUPnPAPI)来进行自动端口转发。
我有点迷失了。 有人可以向我展示继续研究的方向吗? 也许还有别的方法可以实现自动端口转发? 可能有一个我错过的库可以使用吗? 请给予指引,谢谢您提前。