【转】使用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
posted on 2015-01-29 15:00 CSlunatic 阅读(9265) 评论(1) 编辑 收藏 举报