c++ 无法使用miniupnp以可编程方式打开端口

ni65a41a  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(151)

所以我用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是启用在我的路由器,所以这应该已经能够工作。

相关问题