【轉】使用miniupnpd-->upnp協議 映射本地端口到外網


miniupnpc的主要函數介紹

1>.miniupnpc庫主要使用的頭文件有

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

它使用的lib庫是miniupnpc.lib

2>.miniupnpc.h使用的函數有

//主要用來搜索局域網中所有的UPNP設備(注意使用freeUPNPDevlist()釋放資源)
upnpDiscover()

//在UPNP列表中查看有效IGD設備
UPNP_GetValidIGD()

//判斷一個設備是否連接正常
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()

//根據指定設備獲得外網ip地址
UPNP_GetExternalIPAddress()

//根據指定設備,獲取連接類型
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 規則 

root@dvr:/# 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)

root@dvr:/# 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 的詳細用法:

root@dvr:/# 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 多點 )

root@dvr:/# cat /etc/boa/boa.conf | grep Port  //查看其端口號 看是否與upnp映射的端口號相同,不同則改為相同
root@dvr:/# Port: The port Boa runs on.  The default port for http servers is 80.
Port 80

root@dvr:/# boa    //板上的web server ,

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

原文:http://blog.csdn.net/u010597161/article/details/15340015


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM