这几天课比较少,校园网上网要认证才能上网,每次必须输入学号密码,为了方便,写了一个自动登录以及如果在线,登录自服务系统强制下线的小工具。

强制下线思路:获取sessionID----------》获取验证码图片------------》AspriseOCRLib识别验证码---------------》MD5加密、url Encode----------------》登录自服务系统----------------》强制下线---------------------》退出登录。

需要注意的问题:

1、获取验证码时,发送完请求应该Sleep 1秒,等待接收完毕,再调用recv读缓冲区,否则可能图片为接受完。

2、登录请求后需要延时,等待服务器把登录状态set进session中,才可以进行操作。

3、每次发送请求需要使用不同的socket连接。

下面贴一部分代码:(代码有很多疏漏之处,欢迎指正,共同进步)

转载请标明出处。

1、获取连接

 BOOL CforceOutLineDlg::ConnectToServer(const CString strServerUrl,SOCKET& socketClient, const unsigned short nPort)
{
BOOL bRet = FALSE;
WSADATA wsaData;
WORD wVersion = MAKEWORD(,); do
{
if( != WSAStartup(wVersion, &wsaData))
{
break;
} if(LOBYTE( wsaData.wVersion ) != || HIBYTE( wsaData.wVersion ) != )
{
WSACleanup();
break;
} LPHOSTENT lpHostTent;
lpHostTent = gethostbyname(strServerUrl);///根据url获取ip
if (NULL == lpHostTent)
{
break;
} if (socketClient == INVALID_SOCKET)
{
WSACleanup();
break;
} SOCKADDR_IN socketServer;//服务器
socketServer.sin_family = AF_INET;
socketServer.sin_port = htons(nPort);
socketServer.sin_addr = *((LPIN_ADDR)*lpHostTent->h_addr_list); socketClient = socket(AF_INET, SOCK_STREAM, ); if (SOCKET_ERROR == connect(socketClient, (LPSOCKADDR)&socketServer, sizeof(SOCKADDR_IN)))
{
int nErrorCode = WSAGetLastError();
closesocket(socketClient);
break;
} bRet = TRUE;
} while (FALSE); return bRet;
}

2、接收验证码

BOOL CforceOutLineDlg::GetValidateCode(/*SOCKET s,*/CString sessionid)
{
SOCKET client;
ConnectToServer("IP",client);//初始化连接 CString cstrSendData; cstrSendData = "GET /RandomCodeAction.action?randomNum=0.1 HTTP/1.1\r\n";
cstrSendData += "Host: \r\n";
cstrSendData += "Connection: keep-alive\r\n";
cstrSendData += "Accept: image/webp,image/*,*/*;q=0.8\r\n";
cstrSendData += "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36\r\n";
cstrSendData += "Referer:\r\n";
cstrSendData += "Accept-Encoding: gzip, deflate, sdch\r\n";
cstrSendData += "Accept-Language: zh-CN,zh;q=0.8\r\n";
cstrSendData += "Cookie: JSESSIONID=" + sessionid + "\r\n";
cstrSendData += "\r\n"; if (-1 == send(client, cstrSendData.GetBuffer(), cstrSendData.GetLength(), 0))
{
return FALSE;
} char buff[4096]={0}; Sleep(1000);//延时1秒,等待图片流接收完毕 recv(client, buff, sizeof(buff),0); CString temp = buff; int nFirst = temp.Find("close",0); if(nFirst == -1)
return FALSE; nFirst += 9;//加上close 两个\r\n 一个 0 的长度 int picLength = GetPicLength(buff+nFirst); ofstream out("aa.png",ios::out|ios::binary); out.write(buff+nFirst,picLength); out.flush(); out.close(); closesocket(client); return TRUE;
} int CforceOutLineDlg::GetPicLength(char* pic)//查找到连续5个 0x00 的位置
{
int count = 0,i;
for(i = 0;;i++)
{
if(pic[i]==0)
{
count++;
if(count==5)
{
break;
}
}
else
{
count = 0;
}
}
return i-4;
}

3、URlEncode

CString CforceOutLineDlg::UrlEncode(const CString& szToEncode)
{
std::string src = szToEncode;
char hex[] = "0123456789ABCDEF";
CString dst; for (size_t i = 0; i < src.size(); ++i)
{
unsigned char cc = src[i];
if(cc == '\\')
continue; if ( cc >= 'A' && cc <= 'Z'
|| cc >='a' && cc <= 'z'
|| cc >='0' && cc <= '9'
|| cc == '.'
|| cc == '_'
|| cc == '-'
|| cc == '*'
)
{
if (cc == ' ')
{
dst += "+";
}
else
dst += cc;
}
else
{
unsigned char c = static_cast<unsigned char>(src[i]);
dst += '%';
dst += hex[c / 16];
dst += hex[c % 16];
}
} return dst;
}

  转载请标明出处。

c/c++ socket发送http请求访问网站的更多相关文章

  1. C#实现通过HttpWebRequest发送POST请求实现网站自动登陆

    C#实现通过HttpWebRequest发送POST请求实现网站自动登陆   怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数 ...

  2. 使用socket发送http请求(get/post)

    手动发送http请求 解释说明 https://blog.csdn.net/zhangliang_571/article/details/23508953 http://www.cnblogs.com ...

  3. PHP + Socket 发送http请求进而实现站点灌水

    本质上实现组装http信息的请求行,头信息.主题信息.參考it自学网 cookie信息和http请求头有非常大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php re ...

  4. 【C语言】Socket发送HTTP-TCP请求,数据有字符串插入

    问题描述: 场景:编写Socket接口,向LOKI发送POST请求查询数据 BUG发现位置:通过cJSON读取时间戳,发现被截断. 现象:通过read()去读取返回的数据,数据行中被插入字符:如下 c ...

  5. C#用SOCKET发送HTTP请求小例

    private void button1_Click(object sender, EventArgs e) { string urlStr = this.textUrl.Text ; if (url ...

  6. linux c 使用socket 发送http请求 可以发送json格式数据

    #include <stdio.h>#include <sys/socket.h>#include <sys/types.h>#include <time.h ...

  7. php socket 发送http请求 GET POST

    http://docs.php-http.org/en/latest/httplug/users.html <?php /** * Created by PhpStorm. * User: Mc ...

  8. perl6 Socket: 发送HTTP请求

    sub MAIN(Str $host,Str $path, Int $port) { my $send = "GET $path HTTP/1.1\r\nHost: $host\r\n\r\ ...

  9. php socket 发送HTTP请求 POST json

    * HttpRequest.php <?php namespace et\http; /** * Created by PhpStorm. * User: mingzhanghui * Date ...

随机推荐

  1. Dubbo注册中心的四种配置方式详解

    Dubbo目前支持4种注册中心,(multicast,zookeeper,redis,simple) 推荐使用Zookeeper注册中心. 一.Multicast注册中心 不需要启动任何中心节点,只要 ...

  2. ML 徒手系列 SVM

    在Lagrange乘子法中,介绍了如何构建及如何使用对偶函数,对目标问题进行求解. 这一章利用L乘子法对SVM进行推导. SVM 即支持向量机,是通过求解超平面进行分类的一种算法.所谓的支持向量,是在 ...

  3. net start sql server (instance)

    如何启动 SQL Server 实例(net 命令) 其他版本   可以使用 Microsoft Windows net 命令启动 Microsoft SQL Server 服务. 启动 SQL Se ...

  4. linux docket

    什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于  ...

  5. Ubuntu 12.04 LTS为例演示vsftpd虚拟用户 的配置

    vsftpd虚拟用户   2012-05-19 15:46:59|  分类: GNU/Linux |  标签:ubuntu  vsftpd  ftp  虚拟用户  |举报|字号 订阅 我们登录FTP有 ...

  6. Gulp的学习和使用

    Gulp是一种直观.自动化构建的工具. Gulp是基于Node和NPM,安装教程点这里. 什么是Gulp? Gulp使用了node.js的流控制系统,使其(Gulp)构建更快,因为它不需要将临时文件/ ...

  7. 33、生鲜电商平台-定时器,定时任务quartz的设计与架构

    说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生鲜电商平台而言,有定时推送客户备货,定时计算卖家今日的收益,定时 ...

  8. Sharepoint foundation2013独立安装教程

    Sharepoint foundation2013安装教程 一,什么是sharepoint foundation2013 大家都知道Sharepoint是一个非常强大的企业级开发平台,它包含各种功能比 ...

  9. Note: PANOPLY: Low-TCB Linux Applications with SGX Enclaves

    PANOPLY provides middleware for SGX and Linux operating systems. What PANOPLY provides middleware fo ...

  10. c++常考算法知识点汇总

    前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学.就是想当遇到一些比较小的知识,切不值得用一整篇 博客去记述的时 ...