找回密码
 加入
搜索
查看: 3687|回复: 3

[求教VC高人] 关于实现重启路由器功能的代码

[复制链接]
发表于 2009-9-29 02:48:05 | 显示全部楼层 |阅读模式
本帖最后由 tan133 于 2009-10-1 03:08 编辑

VC++ TP-LINK 重启 路由器(转)
[时间]: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:
--------------------------------------------------------------------------------
Server Error: 401 N/A
--------------------------------------------------------------------------------
Access denied
--------------------------------------------------------------------------------
/userRpm/index.htm
--------------------------------------------------------------------------------
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");,即可实现重启路由器功能。
 楼主| 发表于 2009-9-29 02:48:46 | 显示全部楼层
以上是VC写的,我不懂VC,有哪位高人能把他改成AU?
发表于 2009-9-29 03:42:33 | 显示全部楼层
第一次听说这玩意,看了很不错的样子。
发表于 2009-10-12 01:12:05 | 显示全部楼层
明天我试试看!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-11 23:08 , Processed in 0.070922 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表