首页  编辑  

UPnP的支持

Tags: /超级猛料/Network.网络通讯/TCP_IP/   Date Created:

UPnP 的支持

Windows XP中添加了UPnP支持,允许路由设备自动添加端口影射等。在程序中如何实现这种支持呢?例如BitComet就支持这个功能。

要在程序中实现UPnP支持,必须调用SSDP API,即Windows XP中的UPNP.DLL和SSDPAPI.DLL,这两个DLL实现了Control Point的接口。UPNP.DLL包含一个COM接口:IUPnPNAT。

创建IUPnPNAT对象,获取其UPnP.get_StaticPortMappingCollection-->IStaticPortMappingCollection.Add, Remove即可

实际上就是支持UPnP的设备必须监听(UDP) 1900端口,然后实现一些XML的协议交流。

如果Router支持UPnP,建立一个TCP连接到router的80端口(如果仍是默认设置的话),发送以下数据:

POST /upnp/service/WANPPPConnection HTTP/1.1

SOAPACTION: "urn:schemas-upnp-org:service:WANPPPConnection:1#GetExternalIPAddress"

CONTENT-TYPE: text/xml ; charset="utf-8"

Content-Length: 298

<?xml version="1.0" encoding="utf-8"?>

<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

  <s:Body>

     <u:GetExternalIPAddress

xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1" />

  </s:Body>

</s:Envelope>

那么如果正常的话,Router返回的数据:

HTTP/1.0 200 OK

Connection:  close

Server: UPnP/1.0 UPnP-Device-Host/1.0

Content-length: 403

Content-Type: text/xml; charset="utf-8"

<?xml version="1.0"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><m:GetExternalIPAddressResponse xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1"><NewExternalIPAddress>xxx.xxx.xxx.xxx</NewExternalIPAddress></m:GetExternalIPAddressResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

其中<NewExternalIPAddress>xxx.xxx.xxx.xxx</NewExternalIPAddress>中的数据就是外部地址。

UDA1.0-Chinese.pdf (656.6KB)
UPnP Delphi Components.zip (74.5KB)