2014-09-08 9 views
0

Я хочу использовать libminiupnpc(github), чтобы найти устройства и выполнить пересылку/сопоставление портов TCP. Однако я не могу найти ни одного достойного документа или пример кода, который показывает, как использовать API miniupnpc.Как использовать libminiupnpc для настройки перенаправления портов

Кто-нибудь знает хороший документ или пример кода, который показывает, как использовать эту библиотеку?

То, что я сейчас:

#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() это не очевидно, что нужно называться следующим.

+0

Возможно, вам удастся опубликовать тот же вопрос на [форум проекта] (http://miniupnp.tuxfamily.org/forum/) – simonc

+0

Обратите внимание, что форум неактивен. В нем около 1 должности в месяц. Мои вопросы (до сих пор) остались без ответа на форуме. –

ответ

5

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 
} 

Два полезных файлов были upnpc.c и upnpcommands.c из проекта GitHub на https://github.com/miniupnp/miniupnp/tree/master/miniupnpc.

 Смежные вопросы

  • Нет связанных вопросов^_^