c/c++ socket发送http请求访问网站

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

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

需要注意的问题:

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

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

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

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

转载请标明出处。

1、获取连接

 1 BOOL CforceOutLineDlg::ConnectToServer(const CString strServerUrl,SOCKET& socketClient, const unsigned short nPort)
 2 {
 3     BOOL bRet = FALSE;
 4     WSADATA wsaData;
 5     WORD wVersion = MAKEWORD(2,2);
 6
 7     do
 8     {
 9         if(0 != WSAStartup(wVersion, &wsaData))
10         {
11             break;
12         }
13
14         if(LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )
15         {
16             WSACleanup();
17             break;
18         }
19
20         LPHOSTENT lpHostTent;
21         lpHostTent = gethostbyname(strServerUrl);///根据url获取ip
22         if (NULL == lpHostTent)
23         {
24             break;
25         }
26
27
28         if (socketClient == INVALID_SOCKET)
29         {
30             WSACleanup();
31             break;
32         }
33
34         SOCKADDR_IN socketServer;//服务器
35         socketServer.sin_family = AF_INET;
36         socketServer.sin_port = htons(nPort);
37         socketServer.sin_addr = *((LPIN_ADDR)*lpHostTent->h_addr_list);
38
39
40         socketClient = socket(AF_INET, SOCK_STREAM, 0);
41
42         if (SOCKET_ERROR == connect(socketClient, (LPSOCKADDR)&socketServer, sizeof(SOCKADDR_IN)))
43         {
44             int nErrorCode = WSAGetLastError();
45             closesocket(socketClient);
46             break;
47         }
48
49         bRet = TRUE;
50     } while (FALSE);
51
52     return bRet;
53 }  

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;
}

  转载请标明出处。

时间: 2024-10-06 17:05:30

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

使用socket发送http请求(GET/POST)

使用socket发送http请求(GET/POST) 下载LOFTER客户端 1.socket的原理 在相关文章中已经提及,不再赘述. 2.http头的格式 (1)请求行请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.例如,GET /index.html HTTP/1.1.HTTP协议的请求方法有GET.POST.HEAD.PUT.DELETE.OPTIONS.TRACE.CONNECT.这里介绍最常用的GET方法和POST方法.GET:当客户端要从服务器中读

socket发送http请求

转自:思齐-socket发送http请求 socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.baidu.com', 80); //里面的换行代表 \r

PHP + Socket 发送http请求进而实现网站灌水

本质上实现组装http信息的请求行,头信息,主题信息,参考it自学网 cookie信息和http请求头有很大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php require('./http.class.php'); $http = new Http('http://home.verycd.com/cp.php?ac=pm&op=send&touid=0&pmid=0'); $http->setHeader('Accept: text/htm

如果使用socket发送http请求(并且编译成可以被lr调用的压力测试脚本)

#include  <unistd.h> #include  <sys/types.h>       /* basic system data types */ #include  <sys/socket.h>      /* basic socket definitions */ #include  <netinet/in.h>      /* sockaddr_in{} and other Internet defns */ #include  <

bat curl 发送http请求 监控网站

@echo off color 1f title 正在监控 www.0579ld.com.cn echo 正在监控 www.0579ld.com.cn(23.247.53.3).. :aaa D:\curl\curl -I www.0579ld.com.cn>nul set str=%ERRORLEVEL% if not "%str%"=="0" ( echo 在%date% %time:~0,5% 无法正常访问,重启中... :: cd c:\server\

php socket 发送http请求

<?php /** * Created by PhpStorm. * User: Mch * Date: 7/8/18 * Time: 21:39 @func: parse_url http://www.tfjyzx.com/model-school.jsp?area=%E5%BC%80%E5%B0%81&school=%E5%BC%80%E5%B0%81%E5%B8%82%E7%AC%AC%E4%BA%94%E4%B8%AD%E5%AD%A6#%E5%AD%A6%E6%A0%A1%E7%A

perl6 Socket: 发送HTTP请求

sub MAIN(Str $host,Str $path, Int $port) { my $send = "GET $path HTTP/1.1\r\nHost: $host\r\n\r\n"; my $c = IO::Socket::INET.new(:host($host), :port($port)); $c.print: $send; while (my $buff = $c.recv(1024)) { say $buff.print; } $c.close; }

php 利用socket发送GET,POST请求

作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http基础的开发者阅读. 今天给大家带来的是如何利用socket发送GET,POST请求.我借用燕十八老师封装好的一个Http类给进行说明. 在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式提出GET,POST请求呢?答案必然是肯定的.了解过HTT

java 常见几种发送http请求案例

1 import java.io.FileOutputStream; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.io.UnsupportedEncodingException; 7 import java.net.HttpURLConnection