[標題]:[原]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://m.tkk7.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://m.tkk7.com/wintys
posted on 2009-05-29 23:36
天堂露珠 閱讀(5017)
評論(8) 編輯 收藏 所屬分類:
C++