UPnP端口映射实现过程(一)
第一步是发现
控制点再往上搜索感兴趣的设备,而设备向网络中宣告其服务。对于自动端口映射来说就是发现带UPnP功能的路由器。这一过程主要分两步。第一步,使用数据包套接字向239.255.255.250:1900,发送一条多播请求。
M-SEARCH * HTTP/1.1 (SSDH协议定义的搜索方法请求)
HOST: 239.255.255.250:1900 (保留地址,用于多点传送)
MAN:"ssdp:discover"
MX:3 (最长等待时间)
ST:UPnP:rootdevice (搜索目标)
第二步,网络中存在UPnP设备的话,为了被找到,设备必须向发送查找的多播通道的源IP和端口发送响应消息,所以你可以从239.255.255.250:1900这个地址接受到响应消息,其中有设备描述URL。
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
第二步是描述。
通过URL,下载XML文件,并从中找到有关设备的类型,服务类型,控制URL,时间触发URL等。同样分两步,首先下载描述文件。第二步解析该XML文件
第三步是控制。
通过第二步获得的控制URL,通过向其中发送控制消息来实现某些功能,对于自动端口映射来说是查看,增加,删除等
· 增加端口映射。"AddPortMapping"
·"<NewRemoteHost></NewRemoteHost>\n" "<NewExternalPort>ExternalPort</NewExternalPort>\n" "<NewProtocol>Protocol</NewProtocol>\n" "<NewInternalPort>InternalPort</NewInternalPort>n"
"<NewInternalClient>InternalClient</NewInternalClient>\n"
"<NewEnabled>1</NewEnabled>\n"
"<NewPortMappingDescription>PortMappingDescription" "</NewPortMappingDescription>\n"
"<NewLeaseDuration>LeaseDuration</NewLeaseDuration>\n"
· 删除端口映射 "DeletePortMapping"
·"<NewRemoteHost></NewRemoteHost>\n" "<NewExternalPort>ExternalPort</NewExternalPort>\n" "<NewProtocol>Protocol</NewProtocol>\n"
· 获得端口映射信息 "GetGenericPortMappingEntry"
·"<NewPortMappingIndex>PortMappingIndex</NewPortMappingIndex>" "<NewRemoteHost></NewRemoteHost>\n" "<NewExternalPort></NewExternalPort>\n" "<NewProtocol></NewProtocol>\n" "<NewInternalPort></NewInternalPort>\n" "<NewInternalClient></NewInternalClient>\n" "<NewEnabled>1</NewEnabled>\n" "<NewPortMappingDescription>" "</NewPortMappingDescription>\n" "<NewLeaseDuration></NewLeaseDuration>\n"
ExternalPort 外部端口。InternalPort内部端口。这 两者一般就填映射的端口。Protocal 填TCP或UDP。InterClient 一般就是本地IP地址。PortMappingDescription 填写端口映射的描述,比如什么程序建立了这个端口。LeaseDuration 是映射的持续时间,用0表示不永久。PortMappingIndex 是端口映射索引,路由上第几个映射。
相关文章
- Redis分布式锁的正确实现方式(Java版)
- 你还不会搞数据脱敏?MyBatis 插件 + 注解轻松实现数据脱敏,So easy~!
- UPnP端口映射实现过程(二)
- CentOS 7中定时拆分Nginx日志实现详细过程
- Java学习笔记之十三初探Java面向对象的过程及代码实现详解编程语言
- 利用Oracle存储过程实现数据输出(oracle存储过程输出)
- 利用Oracle实现分布式数据查询(oracle分布式查询)
- MySQL存储过程实现条件判断及其应用(mysql存储过程判断)
- 利用Oracle存储过程实现无参数操作(oracle存储过程无参数)
- 精彩人生:利用SQL Server实现自己的梦想(有玩sqlserver)
- 均衡SQL Server负载均衡:实现系统性能最优化(sqlserver 负载)
- 利用MSSQL系统存储过程实现自动化优化(mssql 系统存储过程)
- 简易操作:调用Oracle存储过程实现完美任务(调用oracle存储过程)
- MySQL使用C语言打印结果集的实现方法(c mysql打印结果集)
- 架构师使用Redis实现分布式锁(架构师redis分布式锁)
- 利用Redis实现主从机解耦(主从机 redis)
- Oracle调用存储过程实现数组参数传入(oracle传入数组参数)
- 利用Oracle存储过程实现双向传值(oracle使用存储传值)
- Redis实现的限流技术善用计数(redis限流次数)
- 值Redis实现自增最大值的研究(redis自增最大)
- 巧妙使用JQueryClone添加多行数据,并更新到数据库的实现代码
- Datalist控件使用存储过程来分页实现代码
- 通过隐藏iframe实现文件下载的js方法介绍
- PHP实现通过中文字符比率来判断垃圾评论的方法
- asp.net源程序编译为dll文件并调用的实现过程