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 :1e:::ab:fe
inet addr:192.168.3.111 Bcast:192.168.3.255 Mask:255.255..0Scope:Link
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (170.2 MB) TX bytes: (21.4 MB) root@dvr:/# upnpc-static -a 192.168.3.111 TCP //此处的IP为本机IP
upnpc : miniupnpc library test client. (c) - 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: 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:
external 192.168.1.12: TCP is redirected to internal 192.168.3.111: (duration=)

说明:80 为内部端口, 此端口号可随意设置,只要与 web server的提供的端口号相同就可以了。8008 为外端口,也就是在外面通过 192.168.1.12:8008 就可以访问客户端的web 页面了
Upnpc-static 的详细用法:

root@dvr:/# Upnpc-static
upnpc : miniupnpc library test client. (c) - 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: only)
./upnpc-static [options] -U uniqueID new_lease_time
Update Pinhole (for IGD: only)
./upnpc-static [options] -C uniqueID
Check if Pinhole is Working (for IGD: only)
./upnpc-static [options] -K uniqueID
Get Number of packets going through the rule (for IGD: only)
./upnpc-static [options] -D uniqueID
Delete Pinhole (for IGD: only)
./upnpc-static [options] -S
Get Firewall status (for IGD: 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: only)
./upnpc-static [options] -P
Get Presentation url protocol is UDP or TCP
Options:
- : 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 .
Port root@dvr:/# boa //板上的web server ,

6. 在电脑上测试
这时找一个电脑在浏览器里输入: 192.168.1.12:8008 键入 enter ,客户端里的web页面就呈现在你的面前了

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

【转】使用miniupnpd-->upnp协议 映射本地端口到外网的更多相关文章

  1. 关于Apache本地能访问外网不能访问的问题

    title: 关于Apache本地能访问外网不能访问的问题 date: 2018-08-05 19:22:12 tags: web --- 在配置apache和tomcat时,把它们都配置好,放到服务 ...

  2. 内网穿透神器ngrok——将本地项目驾到外网

    相信做Web开发的同学们,经常会遇到需要将本地部署的Web应用能够让公网环境直接访问到的情况,例如微信应用调试.支付宝接口调试等.这个时候,一个叫ngrok的神器可能会帮到你,它提供了一个能够在公网安 ...

  3. 本地Server发布外网Web应用(Oray实现)

    主要讲解如何将本地当做服务器,发布Web应用至外网访问.   准备条件: 1.web应用服务(此处为Tomcat作为web应用服务器): 2.花生壳应用:   第一步,正常搭建本地web项目,应用名为 ...

  4. 通过网络经过路由器映射电脑ip到外网路由器

    一.内网自己电脑做服务器 自己电脑ip为192.168.0.104 首先先把自己路由器ip192.168.1.82映射到外网路由器,其中外网路由器ip为59.40.0.196 让后本机ip地址192. ...

  5. Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题

        webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...

  6. iptables端口转发规则(内网端口转外网端口)

    需求:外网124.202.173.118需要访问 10.45.225.70的内网54032端口,10.45.225.70服务器有公网地址139.129.109.81将内网地址端口转发到外网地址端口,并 ...

  7. linux里如何配置本地yum源和外网yum源

    一:本地和外网源配置方法 二:外网YUM源的地址 一: ① 本地源配置方法:以光盘里rpm举例(这里使用虚拟机演示) 1.挂载一个iso的镜像 把光盘挂载到一个目录里,然后进入/etc/yum.rep ...

  8. SSH远程连接虚拟机,将虚拟机映射本地端口

    本周学习内容: 1.继续学习了网络是怎么连接的和JavaScript的内容: 2.使用JavaScript实现在页面打印九九乘法表,将编写的乘法表部署到本地IIS服务器: 3.安装sshd服务,使用S ...

  9. 经验分享:Linux 双网卡SNAT和DNAT映射本地端口出外网

    A 机器 网卡1  公网IP网卡2  内网 B 机器网卡1 内网 如果想把公网端口P1 映射为内网B机器端口P2 iptables -t nat -A PREROUTING -d [A公网地址] -p ...

随机推荐

  1. WPF - XAML如何引入名字空间

    WPF 的XAML引入名字空间的概念,经常容易让人混淆.如何引入名字空间,并且在XAML中调用其中的类,下面给一个简单的介绍. 比如我们有一个Hepler类. namespace Wheat.PIMS ...

  2. Chrome浏览器查看cookie

    原文:http://jingyan.baidu.com/article/6b18230954dbc0ba59e15960.html 1. 查看页面的cookie 方法: a). 点击地址栏前面的文档薄 ...

  3. web项目跨域访问

    1.同域相互访问 假设A.html 与 b.html domain都是localhost (同域) A.html中iframe 嵌入 B.html,name=myframe A.html有js fun ...

  4. java基础 二分查找算法

    /*   * 折半查找法:   * 思路:   * 定义三个变量记录查找范围中最大.最小和中间的索引值,每次都是使用中间索引值与要查找的目标进行对比,如果不符合,那么就不停缩小查找范围   * */  ...

  5. 自写图片遮罩层放大功能jquery插件源代码,photobox.js 1.0版,不兼容IE6

    阿嚏~~~ 话说本屌丝没啥开发插件的经验,可是天公不作美,公司须要让我自己开发个图片放大的插件 但公司老大的话,宛如吾皇之圣旨,微臣必当肝脑涂地,莫敢不从啊~~~ 于是乎,作为一个超级小白,本人仅仅能 ...

  6. linux高级技巧:heartbeat+lvs(一)

    1.heartbeat一个简短的引论:        Heartbeat 项目是 Linux-HA project的一个组成部分,它实现了一个高可用集群系统.心跳服务和集群通信是高可用集群的两个关键组 ...

  7. 使用Win32::OLE操作Excel——Excel对象模型

    像VBA操作Excel一样,Win32::OLE模块也是通过对象操作来控制Excel. 如果想自动化操作和控制Excel应用程序,则必须要与Excel对象模型所提供的对象进行交互.理解和熟悉Excel ...

  8. setTimeout()和setInterval()小结

    写在前面:在写H5游戏时经常需要使用定时刷新页面实现动画效果,比较常用即setTimeout()以及setInterval() setTimeout 描述 setTimeout(code,millis ...

  9. samba后台进程及安全模式简介

    识别 Samba 后台程序Linux 服务器通常作为守护程序(daemon) 来实现,这一词源于希腊神话,其中守护神(daemon)是超自然生物.Linux 守护程序在后台运行以便执行一些有用的任务. ...

  10. Notification (通知)的 新版和旧版用法

    Notification (通知)的 新版和旧版用法   一.先来看旧版,Api 11 之前的用法: NotificationManager manager = (NotificationManage ...