隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 155531
          • 排名 - 390

          最新評論

          [標題]:[原]VC實現重啟路由器
          [時間]:2009-5-28
          [摘要]:使用VC發送一個HTTP請求給路由器,實現重啟TP-LINK路由器功能。
          [關鍵字]:TP-LINK,Basic Authorization,Base64,GET,HTTP
          [環境]:TP-LINK TL-R402M SOHO 寬帶路由器 , VC6 , HttpFox,Firebug
          [作者]:Winty (wintys@gmail.com) http://www.aygfsteel.com/wintys

          [正文]:
              在瀏覽器里輸入地址:192.168.1.1,它會彈出一個窗口, 要求輸入密碼。這是因為服務器要求HTTP Basic access authentication(http://en.wikipedia.org/wiki/Basic_access_authentication)。輸入用戶名和密碼就可以進入路由器管理界面了,點擊"重啟路由器"按鍵即可重啟路由器。如何編程實現向路由器發送重啟的請求?

              (1)、打開Windows命令行,將以下命令粘貼到命令行里(注意,最后有一個空行)。
          telnet 192.168.1.1 80
          GET / HTTP/1.1
          Host:192.168.1.1

              服務器會返回如下信息:
          HTTP/1.1 401 N/A
          Server: TP-LINK Router
          Connection: close
          WWW-Authenticate: Basic realm="TP-LINK SOHO Router R402M"
          Content-Type: text/html

          Web Server Error Report:<HR>
                                      <H1>Server Error: 401 N/A</H1>
          <P><HR><H2>Access denied</H2><P><P><HR><H1>/userRpm/index.htm</H1><P><HR>please
          mail problems to support@tp-link.com.cn
              路由器會返回狀態碼:401。這說明,本次訪問是未經授權的,服務器拒絕了。同時,還可以看到:WWW-Authenticate: Basic realm="TP-LINK SOHO Router R402M",這說明路由器確實需要Basic驗證。


              (2)、再使用Firebug和Httpfox分析出點擊"重啟路由器"時,瀏覽器向路由器發送的請求。發現,主要請求內容如下:
          GET /userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7 HTTP/1.1
          Host:192.168.1.1
          Authorization:Basic YWRtaW46YWRtaW4=
              其中,Authorization請求頭的內容中,"Basic"表示"Basic authorization驗證" ;"YWRtaW46YWRtaW4="是使用Base64編碼后的用戶名和密碼,解密后是"admin:admin"。使用Base64編碼有兩個目的:a、使用戶名和密碼不能直接被肉眼識別;b、使傳送的內容中無非法字符,即使用戶名或密碼中有不適于直接使用HTTP協議傳送的字符,使用Base64編碼后,就符合了協議要求。Base64能被輕易解密,所以不能依賴它來實現安全的訪問控制。

              同樣,也可以自己在命令行輸入以下內容,實現以上的HTTP請求,從而實現重啟路由器功能(最后有一個空行):
          telnet 192.168.1.1 80
          GET /userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7 HTTP/1.1
          Host:192.168.1.1
          Authorization:Basic YWRtaW46YWRtaW4=

              (3)、用VC6發送GET請求:
          void CUtil::RestartRouter(CString& strHost)
          {
              CInternetSession session("Winty's Session");
              CHttpFile* pHttpFile;
              //路由器要求Basic Authorization:用戶名:admin,密碼:admin
              CString strHeaders = _T("Authorization:Basic YWRtaW46YWRtaW4="); // 請求頭
              
              try
              {
                  INTERNET_PORT nPort; //端口
                  CString strRelativeRequestURL;
                  nPort = 80;
                  strRelativeRequestURL = "/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7";
                  
                  CHttpConnection* pServer = session.GetHttpConnection(strHost, nPort);
                  
                  pHttpFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,strRelativeRequestURL);
                  pHttpFile->AddRequestHeaders(strHeaders);
                  pHttpFile->SendRequest();
                  
                  //判斷請求是否成功
                  DWORD dwStatusCode;
                  BOOL bSuccess;
                  bSuccess = pHttpFile->QueryInfoStatusCode( dwStatusCode );
                  CString strMsg;
                  strMsg.Format("登陸失敗! 錯誤信息:HttpStatusCode=%d" , dwStatusCode);
                  if(!bSuccess || !(dwStatusCode>=200 && dwStatusCode<300)){
                      AfxMessageBox(strMsg);
                  }
              }
              catch(CException* e)
              {
                  pHttpFile = NULL;
                  throw;
              }
              pHttpFile->Close();
              delete pHttpFile;

              session.Close();
          }
              調用函數:RestartRouter("192.168.1.1");,即可實現重啟路由器功能。

          [參考資料]:
          Basic access authentication :http://en.wikipedia.org/wiki/Basic_access_authentication
          原創作品,轉載請注明出處。
          作者:Winty (wintys@gmail.com)
          博客:http://www.aygfsteel.com/wintys

          posted on 2009-05-29 23:36 天堂露珠 閱讀(5017) 評論(8)  編輯  收藏 所屬分類: C++

          FeedBack:
          # re: [原]VC實現重啟路由器 2009-05-29 23:53 事發當時
          這種情況下,不止vc,所有httpcliet都可以實現吧?。?!  回復  更多評論
            
          # re: [原]VC實現重啟路由器 2009-05-30 09:41 天堂露珠
          @事發當時
          在命令行直接輸入HTTP GET請求都可以,其它的編程語言或工具當然也可以。  回復  更多評論
            
          # re: [原]VC實現重啟路由器[未登錄] 2009-05-31 22:41 java
          一年能在做搜索引擎時,去訪問百度,google,太平凡了,老被封IP,總要重啟路由器,來重新獲取新IP,后來自己就用C#寫了一個,原理和實現方法跟你一樣,,當然感覺很牛B,現在想想真SB.
            回復  更多評論
            
          # re: [原]VC實現重啟路由器 2009-06-01 12:00 天堂露珠
          @java
          上網掉線后,需要重啟路由器,所以寫了一個重啟路由器的實用工具而已。  回復  更多評論
            
          # re: [原]VC實現重啟路由器 2009-11-06 02:18 真陳
          達人,你好
          關于你的這段代碼,我也看過,試著自己整,有點問題
          我的路由器(R402M VER070605)不支持TELNET
          我試過,http://192.168.1.1/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7
          如果把用戶名密碼寫好進入主界面后,用以上鏈接可以成功
          現在的關鍵是
          我想直接通過做一個HTML網頁,讓它一運行就能全自動重啟路由器,而不用每次都去輸入用戶名密碼,就是你的那個basic驗證,怎么做?希望指教,謝謝  回復  更多評論
            
          # re: [原]VC實現重啟路由器 2009-11-06 02:23 真陳
          天堂露珠大大
          最好是希望你能寫一個界面,有兩個INPUT,一個用戶名,一個是密碼
          然后有一個JAVA的bASIC加密(當別人的密碼不是默認的時候,可以方便改)
          然后,用這個繞過輸入用戶名密碼這一步,再http://192.168.1.1/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7 是不是就可以達到重啟的目的了?我的想法對嗎?

          那么,那個怎么寫呢?我是菜鳥,希望得到你的指望  回復  更多評論
            
          # re: [原]VC實現重啟路由器 2009-11-06 10:14 天堂露珠
          我的代碼移植性并不高,就是沒有把密碼等作為參數傳入。但是這樣對我來說已經夠了,實現功能就行了,自己用用很方便,也不用Base64加密了(因為使用的用戶名密碼都已加密YWRtaW46YWRtaW4=)。
          我的TELNET例子只是為了方便手動調試。支不支持并不重要。
          你的想法是對的。無論是用Java、VC還是瀏覽器,只要能向路由器發送HTTP GET請求就可以了。具體的向服務器發送HTTP請求并設置請求頭的Java例子可以在網上找找,然后再改一下就可以了。  回復  更多評論
            
          # re: [原]VC實現重啟路由器 2009-11-06 10:17 天堂露珠
          Form形式的HTTP Basic Authentication
          參考:http://hi.baidu.com/thinkinginlamp/blog/item/16f6d933f131b644ad4b5f98.html
          如(將文件保存為reboot.hta):
          <html>
          <head>
          <title>login</title>
          <script>
          var xmlHttp;

          function createXMLHttpRequest() {
          if (window.ActiveXObject) {
          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
          }
          else if (window.XMLHttpRequest) {
          xmlHttp = new XMLHttpRequest();
          }
          }

          function login() {
          createXMLHttpRequest();

          var username = document.getElementById("username").value;
          var password = document.getElementById("password").value;

          xmlHttp.open("GET", "http://192.168.1.1/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7", false, username, password);
          //xmlHttp.setRequestHeader("Content-Type","...");
          xmlHttp.send(null);

          if(xmlHttp.status!=200)
          alert(xmlHttp.status);
          else
          alert("OK");

          return xmlHttp.status == 200;
          }
          </script>
          </head>
          <body>
          <form action="#" method="post" onsubmit="return login();">
          <fieldset>
          <legend>Login</legend>
          <label for="username">username:</label>
          <input type="text" id="username" name="username" value="admin">

          <label for="password">password:</label>
          <input type="password" id="password" name="password" value="admin">

          <input type="submit" value="submit">
          </fieldset>
          </form>
          </body>
          </html>
          由于Firefox不支持跨域訪問,所以,上述代碼只能在IE中運行。由于是保存為.hta,那么雙擊就可以運行了。  回復  更多評論
            
          主站蜘蛛池模板: 荃湾区| 徐汇区| 凤凰县| 南阳市| 土默特左旗| 新密市| 八宿县| 楚雄市| 宽城| 祁连县| 壤塘县| 金溪县| 双鸭山市| 河东区| 阿图什市| 沾益县| 崇明县| 阿克苏市| 古蔺县| 辽阳县| 萨迦县| 肥乡县| 泾阳县| 达尔| 徐汇区| 南康市| 康乐县| 涿鹿县| 光泽县| 佛冈县| 子长县| 安塞县| 姚安县| 息烽县| 皋兰县| 万州区| 平邑县| 苏尼特右旗| 嫩江县| 隆子县| 湘潭市|