所以我用C++做了一个简单的服务器,我试图通过我的公共IP地址访问它。我知道我可以通过手动配置路由器上的端口转发设置来做到这一点,但我希望能够可编程地打开我的端口,而不必手动操作。这是因为我正在开发一个P2P应用程序,我希望确保网络中的每个对等点都可以相互通信。我决定使用miniupnp,在ChatGPT的帮助下,我能够编写一个hello world程序,该程序应该打开我的端口,但不幸的是它没有。函数UPNP_AddPortMapping
失败的原因是什么?
这是从代码中产生的错误:[neroshop]: UPNP_AddPortMapping: failed to open RPC port
下面是完整的代码:
#include <miniupnpc.h>
#include <upnpcommands.h>
int main(int argc, char** argv)
{
// Initialize the miniupnpc library and obtain a UPnP context
struct UPNPUrls urls;
struct IGDdatas data;
int error = 0;
char lanaddr[INET_ADDRSTRLEN];
// Initialize miniupnpc
struct UPNPDev* devlist = upnpDiscover(2000, NULL, NULL, 0, 0, 2, &error);
if (devlist != NULL) {
// Obtain the UPnP context
error = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
if (error == 1) {
// UPnP context obtained successfully. You can now use the UPnP functions to open ports
if(result.count("rpc")) {
int rpc_port = NEROSHOP_RPC_DEFAULT_PORT;
const char* protocol2 = "TCP";
const char* description2 = "Neroshop RPC Port";
const char* remoteHost2 = "0.0.0.0";
error = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, std::to_string(rpc_port).c_str(), std::to_string(rpc_port).c_str(), lanaddr, description2, protocol2, remoteHost2, NULL);
if (error != UPNPCOMMAND_SUCCESS) {
neroshop::print("UPNP_AddPortMapping: failed to open RPC port", 1);
}
}
}
}
// Release the UPnP context and free resources
FreeUPNPUrls(&urls);
freeUPNPDevlist(devlist);
return 0;
}
您看不到服务器代码,因为我已经排除了这一部分,但它看起来像Server server("0.0.0.0", NEROSHOP_RPC_DEFAULT_PORT);
。我使用POSIX套接字,以防你想知道。此外,UPnP是启用在我的路由器,所以这应该已经能够工作。
1条答案
按热度按时间dphi5xsq1#
解决方案是
remoteHost
应该是NULL
。