UPNP端口映射全过程_第1页
UPNP端口映射全过程_第2页
UPNP端口映射全过程_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UPNP端口映射全过程UPNP的全称是 Universal plug-and-play( 通用即插即用).UPnP 是针对智能家电、无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种架构。它旨在为家庭、小型企业、公共场所中或连接到互联网的ad-hoc 网或未管理网络提供易于使用、灵活且基于标准的连接。(引自这里.) 我们这里用到的自动端口映射只是UPNP的一个小应用。按照UPNP的相关规范,UPNP网络的第步是寻址(获得一个IP地址,在我要解决的问题中这不是一个问题。) 第步是发现,控制点在网上搜索感兴趣的设备,而设备向网络中的控制点宣告其服务。对于自动端口映射来说就是发现带UPNP功能的路由器。发现这个过程主要有两步。第一,使用数据报套接字向50:1900,发送一条多播请求,格式如下 M-SEARCH * HTTP/1.1HOST: 50:1900MAN:ssdp:discoverMX:3ST:UPnP:rootdevice 这个多播请求的含义如下:M-SEARCH SSDP协议定义的搜索请求方法。HOST必须是这个多播地址。MAN的值也必须是ssdp:discover 不可少了双引号。MX的含义是最长等待时间,可以自己设置。ST表示search target 搜索目标。我们在这里用找根设备。另外在编程中我们要在每一行后面加上rn 表示换行。(详见源码 UPNPNAT.discovery(). 第二步,如果你的网络存在一个UPNP设备的话,为了被找到,设备必须向发送查找请求的多播通道的源 IP 地址与端口发送响应信息。所以你可以从50:1900这个地址接收到响应消息。类似下面的消息。 HTTP/1.1 200 OKCACHE-CONTROL: max-age=100DATE: Sun, 15 Jan 2006 06:51:02 GMTEXT:LOCATION: :1900/igd.xmlSERVER: TP-LINK Wireless Router WR541G/5, UPnP/1.0ST: upnp:rootdeviceUSN:uuid:upnp-InternetGatewayDevice-192168141678900001:upnp:rootdevice 接下来我们要从里面获得我们要的消息。首先,我们必须找到 200 OK ,说明没有错误发生,否则一切免谈。接着,我们要找到LOCATION项,获得设备描述URL。(程序中的处理归根到底就是一个子字符的查找。) 到这里,我们的第一步“发现”完成。 第步是描述。在第步中我们往往能获得一个设备的描述URL,在第步中我们要通过一个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 的servicechildNode ,记为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”完成。 第步是控制。通过第步获得的控制URL,通过向其发送控制消息(同样用XML描述)来实现某些功能。对于自动端口映射来说就是查看、增加、删除等。在这里我先把各种控制信息的格式说明一下。(下面的rn都是表示换行,我输入不了反斜杠。) 增加端口映射。 AddPortMapping rn ExternalPortrn rotocolrn InternalPortnInternalClientrn 1rnortMappingDescription rn LeaseDurationrn 删除端口映射DeletePortMapping rn ExternalPortrn rotocolrn 获得端口映射信息GetGenericPortMappingEntry ortMappingIndexrn rn rn rn rn 1rn rn rn 其中斜体部分需要在编程是填入的。ExternalPort 外部端口。InternalPort内部端口。这 两者一般就填映射的端口。Protocal 填TCP或UDP。InterClient 一般就是本地IP地址。PortMappingDescription 填写端口映射的描述,比如什么程序建立了这个端口。LeaseDuration 是映射的持续时间,用0表示不永久。PortMappingIndex 是端口映射索引,路由上第几个映射。 我们再来看下面这个XML文档结构。 rn rn rn rn actionParamsrn rn 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#actionNamern CONTENT-TYPE:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论