自己動手實現UPnP進行埠對映的經過

2021-04-14 02:34:22 字數 1289 閱讀 5863

自己動手實現upnp進行埠對映的經過

從接到任務,到實現了 upnp 在家用路由器上進行埠對映的時間總共花費了 1個半月,下面大概講講從資料蒐集到設計實現的經過,好給有同樣需求的人一些線索(不論及具體實現和**)。

所謂 upnp ,就是「通用的即插即用」 ,注意是通用的,雖然很容易和 windows 的即插即用混淆,但這肯定不是微軟的專利!現在大部分的路由器都支援這個功能,只是預設情況下沒有開啟而已(基於安全考慮)。請管理員手動開啟這個支援選項。

好了,這幾個足已。這就是 upnp 模組的雛形了,不過這還不能直接拿來用的。把裡面能抄的東西都搬到自己的終端軟體當中,果然在簡單組網的環境裡還非常好用,不過,拿到廣州電信研究院進行複雜組網測試的時候,災難發生了,網路裡竟然有超過乙個小型閘道器!最後,軟體竟然在別人的小型閘道器裡建立埠對映! 完蛋了,怎麼會這樣呢? 抓包分析,錯誤定位,這樣一步一步下來,也終於搞清楚了 upnp 的整個互動流程,也萌生了自己實現 upnp 功能模組的念頭,實際上就是特定格式的 xml 互動嘛(http方式)。進行了完備的抓包分析之後,搞清楚所執行的 action 的特定 xml 命令的格式。我重新開始了程式設計,乙個星期後重寫模組完畢,拋棄了微軟那套操作 upnp 的 api 以及煩人的標頭檔案包含,並且也不用擔心 win2000 下不支援該 com 元件了。

下面簡單講講整個 upnp 的互動流程,如果有興趣的就姑且作為乙個開發過程的線索吧,具體報文內容請自行抓包genericucp 例程和家庭閘道器的互動則一目了然 :

① 一開始,程式隨便繫結乙個 udp 埠,向組播位址 "239.255.255.250:1900" 傳送探測報文(查詢的裝置型別是wanconnectiondevice:1 ), 並在超時時間內 recvfrom( ) 等待回應報文。如果網路上的裝置有滿足搜尋條件的,都會直接回應 udp 報文到該 socket 處。

// -----------------  udp 互動結束  -----------------------

② 如果回應報文是正確的,那麼從中應該可以看到對端 upnp 裝置監聽的 location 了, 乙個 http 位址,向這個 http 位址發出 tcp 的 http get 請求,得到乙個 xml 說明頁 (可直接用 iexplore.exe 開啟來看),在裡面確認到有沒有 "wanconnectiondevice:1" 這個子裝置,其下應該會有 "wanipconnection:1" 的這個 service,把其中的 取出來就行了。

③ 在取得 以後,要做的事情就是向這個 http 位址傳送 post 請求,帶上相應 action 的控制命令 xml 就行了,具體可以用genericucp 做一遍,然後抓包後原樣照抄並做一些引數替換即可。

自己動手實現vector

有了實現string的基礎,在加上一點點模板的知識,就可以自己動手實現乙個vector了。下面是我實現的 比較簡單。有點犯懶了,講解以後再寫吧!ifndef my vector h define my vectoe h include typedef unsigned int size t temp...

使用porttunnel進行內外網埠對映

porttunnel工具部署在可以公網訪問的伺服器上,進行埠對映,可以讓該伺服器內網中的機器在公網上直接訪問。方法步驟是 1.使用乙個非預設且未被占用的 rdp埠 rdp預設是 3389 比如選擇 3390 然後使用 porttunnel 將該埠對映到內網的 ip和其 rdp預設埠上,並開啟服務。2...

自己動手實現redux 一

訂閱事件,返回乙個取消訂閱函式 let subscribe cb let dispatch action return export default createstore 當我們使用redux時,首先需要使用redux的createstore並且傳入reducer來建立我們的store impor...