[原]VC实现重启路由器

xiaoxiao2026-06-22  11

[标题]:[原]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.blogjava.net/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.blogjava.net/wintys

 

相关资源:vc++实现简单路由器功能
转载请注明原文地址: https://www.6miu.com/read-5050582.html

最新回复(0)