摘要:
使用uPnP方式在TP-Link上映射端口,配合WCF定時發送動態撥號IP實現遠程訪問與管理。
需求:
A客戶使用撥號上網,IP經常變,有套系統剛部署經常要連過去更新程序與數據庫,每次叫A總QQ遠程相當不便,
當然直接在路由器上建立端口映射那是最方便,但是A總是剛傷人A企業的總經理,A企業的A網管對新上的系統有抵觸(內中緣於大家都懂),
於是乎只能另辟蹊徑,好在發現該企業http://192.168.1.1 可以訪問到,並且是傳說中的TP-Link,當然密碼是拿不到地。
過程:
首先想到的是mgen兄的一片文章( http://www.cnblogs.com/mgen/archive/2013/02/03/2890987.html)
下載代碼后運行報upnpnat.StaticPortMappingCollection;這句引用為空,檢測發現是未開啟xp系統的upnp,於是俺資料去開啟
結果發現根本沒裝組件,安裝組件時有發現沒光盤---都是ghost版的,這年頭那來的XP安裝盤啊.
糾結中想到,你路由器上的端口映射為什么要電腦上裝組件呢,於是在google C# upnp實現端口映射,果然找到2篇相關資料,發現在路由器上添加映射只需要調用路由器的ipc接口,調用是基於http的soap操作,到這里總算不用找xp安裝盤了,遺憾的是那兩篇資料下載的代碼不能執行通過。
不過思路是有了,登錄自家的路由器打開uPnP菜單,華麗的發現PPLive已經神奇般的映射4條記錄,禁用uPnp,過一會再次打開UPnP,發現PPLive總能再我開啟uPnP后頑強的添加一條TCP一條UDP映射^_^,到這里事情就簡單了。
打開俺的HttP Analyzer ,一跟蹤,SOAPAction:....AddProtMapping就呈現在眼前,於是馬上打開VS2010寫下
WebClient wc=new WebClient(); wc.Headers.Add("User-Agent", "OS/version, UPnP/1.0, MiniUPnPc/version"); wc.Headers.Add("SOAPAction", @"""urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"""); wc.Headers.Add("Content-Type", "text/xml"); var url=string.Format("http://192.168.1.1:1900/ipc",firewallAddress); byte[] data=Encoding.Default.GetBytes(xml); wc.UploadData(url, "POST", data); MessageBox.Show("zhong bu zhong ???")
執行完畢刷新路由器中的uPnP列表,果然一條本機3389端口到外網26691的TCP 映射成功添加.....
程序截圖:
端口問題解決了,接下來就是使用WCF動態發送撥號獲取的IP了,這個就比較簡單,俺自己有個網站,租用了空間,在上面放個WCF服務頁,客戶電腦上安裝個小程序定時請求下指定頁面,就可以獲取客戶的公網IP了,WCF中代碼入下
public string RegIp(string clientNo)
{
var properties = OperationContext.Current.IncomingMessageProperties;
var endPoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
var ip= endPoint.Address;
..................
WCF部分代碼到:http://www.cnblogs.com/wdfrog/archive/2013/04/12/3016184.html下載
上面那個端口映射程序的代碼需要的留下Email,回家統一發個^_^!