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>中的数据就是外部地址。