使用miniupnpd-->upnp協議 對映本地埠到外網
阿新 • • 發佈:2019-01-01
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():判斷一個裝置是否連線正常
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 下載地址
說明: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頁面就呈現在你的面前了