我对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端口映射?
谢谢你们!