1. 程式人生 > >使用miniupnpd-->upnp協議 對映本地埠到外網

使用miniupnpd-->upnp協議 對映本地埠到外網

miniupnpc的主要函式介紹

1.miniupnpc庫主要使用的標頭檔案有

#include"miniwget.h"
#include"miniupnpc.h"
#include"upnpcommands.h"
#include"upnperrors.h"

它使用的lib庫是miniupnpc.lib

2.miniupnpc.h使用的函式有

upnpDiscover():主要用來搜尋區域網中所有的UPNP裝置(注意使用freeUPNPDevlist()釋放資源)

UPNP_GetValidIGD():在UPNP列表中檢視有效IGD裝置

UPNPIGD_IsConnected():判斷一個裝置是否連線正常

// 查詢區域網內所有Upnp裝置;按照連結串列的方式返回
UPNPDev* upnpDiscover()

// 釋放upnp裝置連結串列
freeUPNPDevlist(UPNPDev*)

// 從upnp裝置表中查詢有效地裝置;
// @UPNPDev : 裝置列表
// @UPNPUrls : 如果返回值非0,UPNPUrls作為傳出引數
// @IGDdatas : 如果返回值非0,IGDdatas作為傳出引數
// @result : =0沒有IGD裝置;=1有一個連線;=2有裝置但沒有連線;=3有UPNP但不是ICG裝置
UPNP_GetValidIGD(UPNPDev*, UPNPUrls*, IGDdatas*, ..)

// Used when skipping the discovery process.
UPNP_GetIGDFromUrl()
GetUPNPUrls()


// 判斷url是否相連線
// @struct UPNPUrls: 指定的裝置
// @struct IGDdatas: 裝置的其他資訊
// @result : =1連線正常;=0沒有連線
UPNPIGD_IsConnected(UPNPUrls*, IGDdatas);


// 釋放url資源
FreeUPNPUrls(UPNPUrls*);

// 封裝了recv函式
ReceiveData()

// 將內外IP,port在路由器上做一個對映
// @controlURL : IGD裝置的路徑
// @servicetype: IGD裝置型別
// @extPort : 映射出的外網埠
// @inPort : 內網port埠
// @inClient : 內網IP地址
// @desc : 描述資訊;通常設定為NULL
// @proto : 該外網埠支援的型別TCP或UDP
// @remoteHost : 該埠限制的IP地址、通常設定為NULL,表示所有IP都能訪問
// @result : =0對映成功;非0失敗
UPNP_AddPortMapping(char* controlURL, servicetype, extPort, inPort, inClient, desc, proto, remoteHost);


// 刪除指定裝置、指定對映的埠
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
// @extPort : 輸入映射出的外網埠
// @proto : 輸入該外網埠支援的型別TCP或UDP
// @remoteHost : 輸入該埠限制的IP地址、通常設定為NULL,表示所有IP都能訪問
// @result : =0成功;非0失敗
UPNP_DeletePortMapping(controlURL, servicetype, extPort, proto, remoteHost);


3.對upnp常見的操作

UPNP_GetSpecificPortMappingEntry:根據指定裝置和外網埠獲得內網資訊

UPNP_GetExternalIPAddress:根據指定裝置獲得外網ip地址

UPNP_GetConnectionTypeInfo:根據指定裝置,獲取連線型別


// 根據指定的裝置、和指定外網埠和通訊型別,獲得對映埠
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
// @extPort : 輸入映射出的外網埠
// @proto : 輸入該外網埠支援的型別TCP或UDP
// @inPort : 輸出內網port埠
// @inClient : 輸出內網IP地址
// @result : =0成功;非0失敗
UPNP_GetSpecificPortMappingEntry(controlURL, servicetype, extPort, proto, inClient, inPort);


// 根據指定的裝置,獲得所有的對映埠
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
// @index : 輸出對映埠的個數
// @result : =0成功;非0失敗
UPNP_GetGenericPortMappingEntry(controlURL, servicetype, ....);


// 根據指定的IGD裝置和路徑,查詢出外網IP
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
// @expIp : 輸出外網IP地址
// @result : =0成功;非0失敗
UPNP_GetExternalIPAddress(controlURL, servicetype, extIp);

// 獲得指定裝置的狀態
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
// @status : 輸出狀態資訊
// @uptime :
// @lastconnerr: 輸出錯誤程式碼
// @result : =0成功;非0失敗
UPNP_GetStatusInfo(controlURL, servicetype, status, uptime, lastconnerror);


// 根據指定裝置,獲取連線型別
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
// @connectType: 輸出IGD裝置的連線型別
// @result : =0成功;非0失敗
UPNP_GetConnectionTypeInfo(controlURL, servicetype, connectionType);


// 獲得接收和傳送的資料包總數、和位元組總數
// @controlURL : 輸入IGD裝置的路徑
// @servicetype: 輸入IGD裝置型別
UPNP_GetTotalBytesSent(controlURL, servicetype);
UPNP_GetTotalBytesReceived(controlURL, servicetype);
UPNP_GetTotalPacketsSent(controlURL, servicetype);
UPNP_GetTotalPacketsReceived(controlURL, servicetype);

1. Upnp 下載地址

http://miniupnp.free.fr/files/

說明:miniupnpc 為客戶端, miniupnpd 為服務端
這裡下載 miniupnpc-1.6.20120125.tar.gz

2. 編譯miniupnp:
# tar xf miniupnpc-1.6.20120125.tar.gz
# make
在此目錄下會生成 upnpc-static  upnpc-share

3. 配置路由器 讓其開啟 upnp 功能
登入路由器後 選擇 轉發規則-->upnp 設定→ 開啟

4. 在客戶端(loongson 1B 開發板)新增upnp 規則
#  ifconfig  //檢視本機IP
eth0     Link encap:Ethernet  HWaddr 00:1e:64:63:ab:fe  
          inet addr:192.168.3.111  Bcast:192.168.3.255  Mask:255.255.255.0Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:163376 errors:0 dropped:0 overruns:0 frame:0
          TX packets:136701 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:170220701 (170.2 MB)  TX bytes:21403783 (21.4 MB)

#  upnpc-static  -a 192.168.3.111 80 8008 TCP   //此處的IP為本機IP
upnpc : miniupnpc library test client. (c) 2006-2011 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.3.1:1900/igd.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Found valid IGD : http://192.168.3.1:1900/ipc
Local LAN ip address : 192.168.3.111
ExternalIPAddress = 192.168.1.12
InternalIP:Port = 192.168.3.111:80
external 192.168.1.12:8008 TCP is redirected to internal 192.168.3.111:80 (duration=0)

說明:80 為內部埠, 此埠號可隨意設定,只要與 web server的提供的埠號相同就可以了。8008 為外埠,也就是在外面通過 192.168.1.12:8008 就可以訪問客戶端的web 頁面了
Upnpc-static 的詳細用法:#  Upnpc-static
upnpc : miniupnpc library test client. (c) 2006-2011 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
Usage :    ./upnpc-static [options] -a ip port external_port protocol [duration]
        Add port redirection
           ./upnpc-static [options] -d external_port protocol [port2 protocol2] [...]
        Delete port redirection
           ./upnpc-static [options] -s
        Get Connection status
           ./upnpc-static [options] -l
        List redirections
           ./upnpc-static [options] -L
        List redirections (using GetListOfPortMappings, IGD v2)
           ./upnpc-static [options] -r port1 protocol1 [port2 protocol2] [...]
        Add all redirections to the current host
           ./upnpc-static [options] -A remote_ip remote_port internal_ip internal_port protocol lease_time
        Add Pinhole (for IGD:2 only)
           ./upnpc-static [options] -U uniqueID new_lease_time
        Update Pinhole (for IGD:2 only)
           ./upnpc-static [options] -C uniqueID
        Check if Pinhole is Working (for IGD:2 only)
           ./upnpc-static [options] -K uniqueID
        Get Number of packets going through the rule (for IGD:2 only)
           ./upnpc-static [options] -D uniqueID
        Delete Pinhole (for IGD:2 only)
           ./upnpc-static [options] -S
        Get Firewall status (for IGD:2 only)
           ./upnpc-static [options] -w routerip
        set the ip address of the router with upnp server
           ./upnpc-static [options] -G remote_ip remote_port internal_ip internal_port protocol
        Get Outbound Pinhole Timeout (for IGD:2 only)
           ./upnpc-static [options] -P
        Get Presentation url

protocol is UDP or TCP
Options:
  -6 : use ip v6 instead of ip v4.
  -u url : bypass discovery process by providing the XML root description url.
  -m address/interface : provide ip address (ip v4) or interface name (ip v6) to use for sending SSDP multicast packets.
  -p path : use this path for MiniSSDPd socket.


備註:客戶端要和路由器連在一起,因為upnp 只能穿透 1 層網路

這時再次登陸路由器 選擇 轉發規則-->upnp 設定→ 重新整理 就可以看到添加了一條 upnp規則
當前UPnP設定列表
ID     應用描述     外部埠     協議型別     內部埠     IP地址     狀態
1    libminiupnpc    8008    TCP    80    192.168.3.111    已啟用
    

5. 在客戶端開啟web 伺服器(loongson 1B開發板上用 boa 做web server,因為其大小隻有 100 KB 多點 )
# cat /etc/boa/boa.conf | grep Port  //檢視其埠號 看是否與upnp對映的埠號相同,不同則改為相同
 #Port: The port Boa runs on.  The default port for http servers is 80.
Port 80

# boa    //板上的web server ,

6. 在電腦上測試
這時找一個電腦在瀏覽器裡輸入: 192.168.1.12:8008 鍵入 enter ,客戶端裡的web頁面就呈現在你的面前了