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

强制下线思路:获取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. kvm虚拟机命令梳理

    kvm虚拟机命令梳理 )查看KVM虚拟机配置文件及运行状态 KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录是配置kvm虚拟机开机自启动目录. virsh命 ...

  2. TS学习之变量声明

    1.Var 声明变量 a)存在变量提升 (function(){ var a = "1"; var f = function(){}; var b = "2"; ...

  3. 解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题

    刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...

  4. Rreplication 性能差(转储200万门诊处方zjysb012)

    ETLDB性能差(HIS转储200万门诊处方zjysb012) 解决方法: 1.禁用cdc.Hismz_capture 2.停止cdc.Hismz_capture 3.关闭zjysb012,zjysb ...

  5. Ok6410裸机驱动学习(二)ARM基础知识

    1.ARM工作模式 ARM微处理器支持7种工作模式,分别为: l  用户模式(usr):ARM处理器正常的程序执行状态(Linux用户态程序) l  快速中断模式(fiq):用于高速数据传输或通道处理 ...

  6. Java探索之旅(7)——对象的思考

    1.知识要点 ❶不可变类:一旦创建,其内容不能改变的类称之为不可变类.满足:⑴所有数据域私有,⑵没有修改器,⑶没有访问器方法,其返回一个指向可变数据域的引用.(这样通过引用就能修改私有数据域).比如, ...

  7. 使用JFileChooser打开文件

    -----------------siwuxie095                                 工程名:TestFileChooser 包名:com.siwuxie095.fi ...

  8. Jmeter进行简单mysql数据库测试

    1.环境准备: mysql: mysql-5.7.17.msi jdbc驱动: 自己百度一下即可 Jmeter:  3.2 2.打开Jmeter,创建测试计划,   点击浏览,添加jdbc驱动 3.添 ...

  9. Learning Python 008 正则表达式-001

    Python 正则表达式 总结 这节课讲讲正真使用的技术 - 正真表达式. 文本爬虫 什么是正则表达式 正则表达式这个名词听起来就有一种很官方的感觉,但是它是一个很很很有用的技术.我用语言是不能形容它 ...

  10. C#String.Split (string[], StringSplitOptions)中的StringSplitOptions是什么意思,看了msdn还是不懂?

    MSDN上面这样子写的: [ComVisibleAttribute(false)] public string[] Split(string[] separator,StringSplitOption ...