gpt4 book ai didi

linux - 如何使用 libminiupnpc 设置端口转发

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:13 39 4
gpt4 key购买 nike

我想使用 libminiupnpc (github)查找设备并进行 TCP 端口转发/映射。但是,我找不到一个像样的文档或示例代码来说明如何使用 miniupnpc API。

有人知道展示如何使用此库的好文档或示例代码吗?

我现在拥有的是:

#include <miniupnpc/miniupnpc.h>
...
int error = 0;
UPNPDev *dev = upnpDiscover(2000, nullptr, nullptr, 0, 0, &error);

...这似乎在我的路由器上正确返回了信息:

2014-09-08 11:36:17.417132 debug  - UPnP ERROR: 0
2014-09-08 11:36:17.417394 debug - UPnP device:
url: http://192.168.1.1:5431/dyndev/uuid:207605a3-efd0-d0ef-a320-162376a3d04000
st: urn:schemas-upnp-org:device:InternetGatewayDevice:1
buf: http://192.168.1.1:5431/dyndev/uuid:207605a3-efd0-d0ef-a320-162376a3d04000

问题不在于 upnpDiscover(),接下来需要调用什么并不明显。

最佳答案

Miniupnp 没有很好(或根本没有?)记录。这是我最终发现添加和列出端口映射所必需的。我将省略错误处理。

int error = 0;
struct UPNPDev *upnp_dev = upnpDiscover(
2000 , // time to wait (milliseconds)
nullptr , // multicast interface (or null defaults to 239.255.255.250)
nullptr , // path to minissdpd socket (or null defaults to /var/run/minissdpd.sock)
0 , // source port to use (or zero defaults to port 1900)
0 , // 0==IPv4, 1==IPv6
&error ); // error condition

char lan_address[64];
struct UPNPUrls upnp_urls;
struct IGDdatas upnp_data;
int status = UPNP_GetValidIGD(upnp_dev, &upnp_urls, &upnp_data, lan_address, sizeof(lan_address));
// look up possible "status" values, the number "1" indicates a valid IGD was found

// get the external (WAN) IP address
char wan_address[64];
UPNP_GetExternalIPAddress(upnp_urls.controlURL, upnp_data.first.servicetype, wan_address);

// add a new TCP port mapping from WAN port 12345 to local host port 24680
error = UPNP_AddPortMapping(
upnp_urls.controlURL,
upnp_data.first.servicetype,
"12345" , // external (WAN) port requested
"24680" , // internal (LAN) port to which packets will be redirected
lan_address , // internal (LAN) address to which packets will be redirected
"FooBar server for XYZ", // text description to indicate why or who is responsible for the port mapping
"TCP" , // protocol must be either TCP or UDP
nullptr , // remote (peer) host address or nullptr for no restriction
"86400" ); // port map lease duration (in seconds) or zero for "as long as possible"

// list all port mappings
size_t index = 0;
while (true)
{
char map_wan_port [200] = "";
char map_lan_address [200] = "";
char map_lan_port [200] = "";
char map_protocol [200] = "";
char map_description [200] = "";
char map_mapping_enabled [200] = "";
char map_remote_host [200] = "";
char map_lease_duration [200] = ""; // original time, not remaining time :(

error = UPNP_GetGenericPortMappingEntry(
upnp_urls.controlURL ,
upnp_data.first.servicetype ,
std::to_string(index).c_str() ,
map_wan_port ,
map_lan_address ,
map_lan_port ,
map_protocol ,
map_description ,
map_mapping_enabled ,
map_remote_host ,
map_lease_duration );

if (error)
{
break; // no more port mappings available
}

std::cout << ....print out or do whatever you want with the map_* fields
}

两个有用的文件是来自 github 项目的 upnpc.cupnpcommands.c https://github.com/miniupnp/miniupnp/tree/master/miniupnpc .

关于linux - 如何使用 libminiupnpc 设置端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25723783/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com