学习资料下载:http://download.csdn.net/detail/yangguangmeng/7218265

UPNP的全称是 Universal plug-and-play( 通用即插即用).UPnP 是针对智能家电、无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种架构。它旨在为家庭、小型企业、公共场所中或连接到互联网的ad-hoc 网或未管理网络提供易于使用、灵活且基于标准的连接。(引自这里.)

  我们这里用到的自动端口映射只是UPNP的一个小应用。按照UPNP的相关规范,UPNP网络的第0步是寻址(获得一个IP地址,在我要解决的问题中这不是一个问题。)       
    第1步是发现,控制点在网上搜索感兴趣的设备,而设备向网络中的控制点宣告其服务。对于自动端口映射来说就是发现带UPNP功能的路由器。
发现这个过程主要有两步。第一,使用数据报套接字向239.255.255.250:1900,发送一条多播请求,格式如下 
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN:"ssdp:discover"
MX:3
ST:UPnP:rootdevice
      这个多播请求的含义如下:M-SEARCH SSDP协议定义的搜索请求方法。HOST必须是这个多播地址。MAN的值也必须是"ssdp:discover" 不可少了双引号。MX的含义是最长等待时间,可以自己设置。ST表示search target 搜索目标。我们在这里用找根设备。另外在编程中我们要在每一行后面加上"rn" 表示换行。(详见源码 UPNPNAT.discovery()). 
      第二步,如果你的网络存在一个UPNP设备的话,为了被找到,设备必须向发送查找请求的多播通道的源 IP 地址与端口发送响应信息。所以你可以从239.255.255.250:1900这个地址接收到响应消息。类似下面的消息。 
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=100
DATE: Sun, 15 Jan 2006 06:51:02 GMT
EXT:
LOCATION: http://192.168.14.1:1900/igd.xml
SERVER: TP-LINK Wireless Router WR541G/5, UPnP/1.0
ST: upnp:rootdevice
USN:uuid:upnp-InternetGatewayDevice-192168141678900001::upnp:rootdevice
      接下来我们要从里面获得我们要的消息。首先,我们必须找到" 200 OK ",说明没有错误发生,否则一切免谈。接着,我们要找到LOCATION项,获得设备描述URL。(程序中的处理归根到底就是一个子字符的查找。) 
       到这里,我们的第一步“发现”完成。
   第2步是描述。在第1步中我们往往能获得一个设备的描述URL,在第2步中我们要通过一个URL,下载一个XML文件。并从中找到有关设备的类型,服务类型,控制URL,事件触发URL等。
我们同样分两步进行,首先下载设备描述文件。(请看源码中UPNPNAT::get_description()函数)
    1.解析描述文件的URL,获得主机(host)、端口(port)、路径(path).(parseUrl函数) 
    2.连接到host:port (tcp_connect 函数)
    3.构造类似 
                                                GET path HTTP/1.1
                                                Host: host:port 
的信息(第二行下要一个空行),并通过刚才的TCP 套接字,发送到路由器。(sprintf ,send 函数). 
    4.接收数据,我使用flag为 MSG_WAITALL的recv函数,函数一直阻塞直到数据全部读完。 数据最终保存在std::string description_info中。 
    我想通过浏览器下载这个文件的过程是类似的吧。 
    然后,解析这个XML文件。(请看源码 中UPNPNAT:: parser_description()函数) 
我们找到"root"的"deviceType"是"urn:schemas-upnp-org:device:InternetGatewayDevice:1"的"device" childNode ,获得这个"device"的"deviceList",记为A。 
    找到A的"deviceType"是"urn:schemas-upnp-org:device:WANDevice:1"的"device" childNode ,获得这个"device"的"deviceList",记为B。 
    找到B的"deviceType"是"urn:schemas-upnp-org:device:WANConnectionDevice:1"的"device" childNode ,获得这个"device"的"serviceList",记为C。 
    找到C的"serviceType"是"urn:schemas-upnp-org:service:WANIPConnection:1" 或"urn:schemas-upnp-org:service:WANPPPConnection:1" 的"service"  childNode ,记为D.
    获得D的"controlUrl"保存在std::string control_url中。 
    但是这里获得control_url一般为相对URL,所以要从"root"下面,找到"URLBase"的值,(如果是空,则用describe_url的"htpp://xxx.xxx.xxx.xxx:xxxx"部分代替.) 
    最后在相对的control_url前加上URLBasr 获得完整的control_url. 
    至此,第二步“获得控制URL”完成。 
    第3步是控制。通过第2步获得的控制URL,通过向其发送控制消息(同样用XML描述)来实现某些功能。对于自动端口映射来说就是查看、增加、删除等。
在这里我先把各种控制信息的格式说明一下。(下面的rn都是表示换行,我输入不了反斜杠。) 
增加端口映射。 "AddPortMapping" 
"<NewRemoteHost></NewRemoteHost>rn"                              "<NewExternalPort>ExternalPort</NewExternalPort>rn"                               "<NewProtocol>rotocol</NewProtocol>rn"                                      "<NewInternalPort>InternalPort</NewInternalPort>n"
"<NewInternalClient>InternalClient</NewInternalClient>rn"                 
"<NewEnabled>1</NewEnabled>rn"
"<NewPortMappingDescription>ortMappingDescription"       "</NewPortMappingDescription>rn"       
"<NewLeaseDuration>LeaseDuration</NewLeaseDuration>rn" 
删除端口映射 "DeletePortMapping" 
"<NewRemoteHost></NewRemoteHost>rn" "<NewExternalPort>ExternalPort</NewExternalPort>rn"   "<NewProtocol>rotocol</NewProtocol>rn" 
获得端口映射信息 "GetGenericPortMappingEntry" 
"<NewPortMappingIndex>ortMappingIndex</NewPortMappingIndex>"  "<NewRemoteHost></NewRemoteHost>rn"   "<NewExternalPort></NewExternalPort>rn" "<NewProtocol></NewProtocol>rn"     "<NewInternalPort></NewInternalPort>rn" "<NewInternalClient></NewInternalClient>rn" "<NewEnabled>1</NewEnabled>rn"  "<NewPortMappingDescription>"                                          "</NewPortMappingDescription>rn"           "<NewLeaseDuration></NewLeaseDuration>rn"
     其中斜体部分需要在编程是填入的。ExternalPort 外部端口。InternalPort内部端口。这 两者一般就填映射的端口。Protocal 填TCP或UDP。InterClient 一般就是本地IP地址。PortMappingDescription 填写端口映射的描述,比如什么程序建立了这个端口。LeaseDuration 是映射的持续时间,用0表示不永久。PortMappingIndex 是端口映射索引,路由上第几个映射。 
     我们再来看下面这个XML文档结构。 
     "<?xml version="1.0" encoding="utf-8"?>rn" 
     "<s:Envelope xmlns:s="
     ""http://schemas.xmlsoap.org/soap/envelope/" "
     "s:encodingStyle="                                   
     ""http://schemas.xmlsoap.org/soap/encoding/">rn"
     "<s:Body>rn" 
     "<u:actionName xmlns:u="serviceType">rn"
     "actionParams</u:actionName>rn" 
     "</s:Body>rn"
     "</s:Envelope>rn" 
     我们在actionName 处填入"AddPortMapping" "DeletePortMapping" "GetGenericPortMappingEntry"。serviceType 处填入设备的服务类型。"urn:schemas-upnp-org:service:WANIPConnection:1"或"urn:schemas-upnp-org:service:WANPPPConnection:1"。actionParams 填入上面的各种控制信息。 
    最后在前面加上HTTP头。 
    "POST path HTTP/1.1rn"
    "HOST: host:portrn"      
    "SOAPACTION:"serviceType#actionName"rn"  
    "CONTENT-TYPE: text/xml ; charset="utf-8"rn"
    "Content-Length: contentLength rnrn" 
    path host port 意思很明显。contentLength面那个XML文档的长度。 
  然后连接到host:port,发送到整个信息即可完成控制            

第4步事件触发和第5步展示在自动端口映射没用用到。有兴趣可以自己看文档。

测试:

vc6.0生成可执行程序,选择端口10000,点击开始执行,映射

查看路由器外网IP,

WAN口状态

MAC地址:28:2C:B2:A7:5D:23

IP 地址:119.80.47.73     PPPoE拨号

子网掩码:255.255.255.255

网关:119.80.46.1     WAN口未连接

DNS服务器:202.106.46.151 202.106.196.115

telenet 119.80.47.73,10000

UPNP端口映射全过称相关推荐

  1. UPnP端口映射的实现[转载]

    防火墙拦截了一个svchost到239.255.255.250:1900的访问请求,经查原来是UPnP端口映射,顺便把搜集的有关实现方法放上. UPnP 端口映射的实现 原作者: yoqi(优奇) 原 ...

  2. UPNP端口映射Android实现

    这一段一直研究UPNP协议,搞得头都快炸了,找到一个upnp的jar包,感觉对发现InternetGatewayDevice非常方便.下面写了一个小程序,是发现路由器并进行端口映射的. package ...

  3. UPnP 端口映射原理

    文章目录 一. 简介 二. 协议 2.1. 发现 2.2. 控制 三. miniupnp 3.1. upnpc 常用命令介绍 3.2. miniupnp 映射部分代码简单逻辑 参考 一. 简介 实现 ...

  4. UPnP端口映射设置操作

    目标:对UPnP服务的端口映射增删改查操作. 参考:这篇文章原理说的比较清楚. 方案一 使用gupnp-tools,gupnp是一个upnp开发库,其中gupnp-tools带了一个工具gupnp-u ...

  5. java upnp 端口映射_路由器 UPnP设置与端口映射操作步骤合集 几种常用猫设置

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 所列如没你需要的猫,可留言 实达_ADSL_2110EH 详细端口映射的设置 假设内网IP为:192.168.10.2 在IE中用http://192.1 ...

  6. NAT端口映射全攻略

    网外(Internet)访问代理服务器内部的实现方法 由于公网IP地址有限,不少ISP都采用多个内网用户通过代理和网关路由共用一个公网IP上INTERNET的方法,这样就限制了这些用户在自己计算机上架 ...

  7. P2P端口映射 UPnP设置功能和使用详解

    P2P端口映射 UPnP设置功能和使用详解     在网上看了很多关于如何打开UPnP功能的文章,发现竟然没有一篇文章能把整个UPnP的设置过程介绍全的,都是只讲到一部分.所以决定写篇文章,至少把设置 ...

  8. BT下载教程之UPnP功能使用、BT端口映射、内网外网之完全解析

    以下是微软官方网站对UPnP的解释: 问:什么是 UpnP? 答:通用即插即用 (UPnP) 是一种用于 PC 机和智能设备(或仪器)的常见对等网络连接的体系结构,尤其是在家庭中.UPnP 以 Int ...

  9. 工业路由器的端口映射方法 NAT/DMZ/UPNP

    NAT英文全称是"Network Address Translation",中文意思是"网络地址转换"或者说端口映射,顾名思义,它是一种把内部私有网络地址(IP ...

最新文章

  1. AutoX李卓:无人驾驶市场是渐进式的,但技术其实很难渐进式
  2. [react] React必须使用JSX吗?
  3. PMP读书笔记(第1章)
  4. linux禁用root登录
  5. C#如何与OPC连接
  6. 21、OSPF配置实验之特殊区域totally stub
  7. 图片-标签、格式\内联框架\音视频播放——HTML
  8. P2525 Uim的情人节礼物·其之壱 【字典序】【STL:prev_permutation】
  9. 以太坊平台评估 私有链和联盟链的机会与挑战
  10. UEFI 启动 win7
  11. 2021杭电计算机考研经验帖
  12. 金山Wps珠海实习杂记(一)
  13. Debezium报错处理系列十:Could not find existing binlog information while attempting schema only recovery sna
  14. dhtml gantt所有配置_甘特图dhtmlxGantt使用教程:如何快速设置内联编辑器和编辑JavaScript Gantt数据...
  15. 全屋智能长途跑,谁能与华为一战?
  16. 基于spring+springmvc+mybatis的个人简易记账系统(包含数据库)
  17. 基于matlab的RS编译码仿真,从底层原理分析RS编译码的实现过程
  18. 【Mysql笔试】-常见笔试题汇总
  19. 分布式高可用高并发物联网(车联网-JT808协议)平台架构方案
  20. FTP电脑间传输文件

热门文章

  1. ES6代码转为ES5代码的在线转换工具以及运行工具
  2. 逻辑思维500题之排除法
  3. js滚播图实现LOL效果图总结一
  4. 猿辅导大数据校招1面+2面面经
  5. 功率预测发展趋势之概率预测
  6. 魔兽争霸 怎么窗口化
  7. 1028 人口普查 (20 分)测试点3格式错误
  8. 程序猿是如此!人亦是如此!
  9. python证券_又到牛市!带你学习一个python强大证券数据分析工具
  10. 2、员工的激励与自我激励 - 项目管理系列文章