如何在将套接字绑定到随机端口时将miniupnpc与Boost.Asio UDP一起使用

时间:2015-04-01 13:47:08

标签: c++ sockets boost-asio upnp miniupnpc

我对miniupnp缺乏文档感到震惊,我相信有很多人使用它,但几乎没有文档,我在RakNet的源代码中找到了一段代码来指导我。

现在我有一个概念性问题......

我正在开发一个通过UDP连接到服务器的应用程序(服务器应该可以访问,服务器UDP端口是一个特定的打开,我可以使用任何打开测试端口检查器),然后服务器将两个或多个客户端相互通信(p2p),因此我需要绕过客户端中的NAT以使其工作。

我已经通过NAT工作了,这已经解决了很多案例。

现在,我想添加UPNP功能,用这个来解决NAT问题。

我正在使用miniupnpc,我处理与Boost.Asio的连接。

struct UPNPDev * devlist = 0;
devlist = upnpDiscover(2000, 0, 0, 0, 0, 0);
if (devlist) {
    std::cout << "\nList of UPNP devices found on the network :\n";

    struct UPNPDev * device;
    for(device = devlist; device; device = device->pNext) {
        std::cout << "\ndesc: " << device->descURL << "\n st: " << device->st << "\n";
    }

    char lanaddr[64];   /* my ip address on the LAN */
    struct UPNPUrls urls;
    struct IGDdatas data;
    if (UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)) == 1) {
        string port = lexical_cast<string>(socket->local_endpoint().port());

        int r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
            port.c_str(), port.c_str(), lanaddr, 0, "UDP", 0, "0");

        if (r != UPNPCOMMAND_SUCCESS) {
            std::cout << "\nupnp fail";
        }

        char intPort[6];
        char intClient[16];

        char desc[128];
        char enabled[128];
        char leaseDuration[128];
        r = UPNP_GetSpecificPortMappingEntry(urls.controlURL,
            data.first.servicetype,
            port.c_str(), "UDP", 0,
            intClient, intPort,
            desc, enabled, leaseDuration);

        if (r != UPNPCOMMAND_SUCCESS) {
            std::cout << "\nupnp fail";
        }else {
            std::cout << "\nupnp success on port " << port;
        }
    }
}

正如您所看到的,我在绑定套接字后执行UPNP(我在没有特定端口的情况下绑定它,如下所示:)

asio::udp::socket socket(*this->ioService, asio::udp::endpoint());

我的问题是,这个UPNP执行是否有意义?如果我在绑定到套接字后绑定到套接字的随机端口上执行UPNP,那么这个套接字是否真的会使用UPNP端口映射?

谢谢你们!

0 个答案:

没有答案