socket怎么样能在一个连接上发送两次HTTP请求?

BAO BAO 2018-08-01 02:59:35
故事是这样的:一个QQ好友说用vbs怎么网络发送数据,我说用C socket吧,他主要是想在这个网站查询高考录取情况,页面很简单就一个准考证号,身份证号,和一个明文验证码, 想要30分钟 自动检测一次是否被录取了。
网址是:http://cx.ahzsks.cn/pugao/pglq2018_in.php
然后我就用C socket连接网站 GET请求获取源码,解析明文验证码后,再用这个验证码构造新的POST包,
问题来了:连接上这个网站,send发送GET并recv接收到源码后,连接就断开了,反正是网站那边断开的,
我使用Connection: keep-alive 还是Connection: close,都是 发送一次就断开了,可能是服务器那边设置的吧。
我试了腾讯网站www.qq.com就可以 在一个连接上发送多次请求,只有不发请求一段事件后 连接才会中断

我本来想着 连接到那个高考成绩网站 现发送GET获取验证码后,继续POST提交 ,但一个GET后 就关闭了,我就想着从新再连接
一次网站吧 connect 连接失败,我在第二次连接前 closesocket也不行。很郁闷,
请大家帮我看看 怎么回事???

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
char code[5];
char coke[90];
int main()
{
char senData[] = "GET /pugao/pglq2018_in.php HTTP/1.1\r\n"
"Host: cx.ahzsks.cn\r\n"
"Connection: keep-alive\r\n\r\n";
char Data[8192],revData[1024]={0};
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in servAddr = {AF_INET, htons(80)};
servAddr.sin_addr.s_addr = inet_addr("220.178.20.198");
connect(sClient,(struct sockaddr*)&servAddr,sizeof(servAddr));
send(sClient, senData, strlen(senData), 0);
while(recv(sClient,revData,sizeof(revData),0)>0)
{
strcat(Data, revData);
memset(revData,0,1024);
}
strncpy(code, strstr(Data,"验证码") + 122, 4); //获取4位验证码
sscanf(strstr(Data,"Cookie"), "%[^;]",coke); //获取Cookie
printf("%s\n", coke);
printf("本次验证码为:%s\n", code);
memset(revData,0,1024);
Sleep(100);

char POST[1024];
sprintf(POST, "POST /pugao/pglq2018_out.php HTTP/1.1\r\n"
"Host: cx.ahzsks.cn\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 51\r\n"
"Cache-Control: max-age=0\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
"Origin: http://cx.ahzsks.cn\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Referer: http://cx.ahzsks.cn/pugao/pglq2018_in.php\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Language: zh-CN,zh;q=0.8\r\n"
"%s\r\n\r\n"
"ksh=18341182151435&sfzh=341126199804297313&yzm=%d\r\n\r\n", coke, atoi(code));

//再次 send POST 查询数据
//connect(sClient,(struct sockaddr*)&servAddr,sizeof(servAddr)); //这一句加不加都一个样 连接不上 发送不过去
send(sClient, POST, strlen(POST), 0);
while(recv(sClient,revData,sizeof(revData),0)>0)
{
puts(revData);
}

closesocket(sClient);
WSACleanup();
return 0;
}

...全文
1039 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyefangzhou24 2018-08-06
  • 打赏
  • 举报
回复
引用 4 楼 wqte45 的回复:
[quote=引用 2 楼 yiyefangzhou24 的回复:]
HTTP本身不是基于长链接的,为什么不能断开?两次请求才是正常的请求方式,请仔细学习参考一下爬虫的一些基本原理,一般来说
1、爬虫基本没有用c开发的,效率低下,因为有一些成熟的语言/脚本甚至程序能够实现,参考python、php、ruby、websocket的一些脚本语言,实现你上述的功能只需要短短几行代码,并且方便后期维护和更改,甚至可以使用Linux的curl命令,非常强大(Windows下有对应的程序curl.exehttps://curl.haxx.se/download.html
2、http并非基于socket的常连接,一次请求就是一次请求,一味的要求常链接需要apache开启对应的设定,一般爬虫请求一次之后(比如登陆操作)需要记录下服务器返回的cookie或者phpsession,加入到第二次的请求的请求头中,实现登陆功能。


你这获取的http知识 还存留在 http1.0吧 从http1.1开始 就支持长连接了 服务器默认支持Connection: keep-alive 这样可以在一个连接上发送多次请求 福区旗默认设置是100条。好多网站默认都支持长连接 比如QQ www.qq.com 你尝试发送一个http请求获取主页源码,它返回源码后并不会立即断开,你可以继续发送请求。百度也支持长连接。 说http不支持长连接的 我感觉你们都是在网上随便搜索的信息 那些信息都是多久前的啊,你最近写过 http协议相关的程序吗?[/quote]
哦,看错了,你就是楼主
yiyefangzhou24 2018-08-06
  • 打赏
  • 举报
回复
引用 4 楼 wqte45 的回复:
[quote=引用 2 楼 yiyefangzhou24 的回复:]
HTTP本身不是基于长链接的,为什么不能断开?两次请求才是正常的请求方式,请仔细学习参考一下爬虫的一些基本原理,一般来说
1、爬虫基本没有用c开发的,效率低下,因为有一些成熟的语言/脚本甚至程序能够实现,参考python、php、ruby、websocket的一些脚本语言,实现你上述的功能只需要短短几行代码,并且方便后期维护和更改,甚至可以使用Linux的curl命令,非常强大(Windows下有对应的程序curl.exehttps://curl.haxx.se/download.html
2、http并非基于socket的常连接,一次请求就是一次请求,一味的要求常链接需要apache开启对应的设定,一般爬虫请求一次之后(比如登陆操作)需要记录下服务器返回的cookie或者phpsession,加入到第二次的请求的请求头中,实现登陆功能。


你这获取的http知识 还存留在 http1.0吧 从http1.1开始 就支持长连接了 服务器默认支持Connection: keep-alive 这样可以在一个连接上发送多次请求 福区旗默认设置是100条。好多网站默认都支持长连接 比如QQ www.qq.com 你尝试发送一个http请求获取主页源码,它返回源码后并不会立即断开,你可以继续发送请求。百度也支持长连接。 说http不支持长连接的 我感觉你们都是在网上随便搜索的信息 那些信息都是多久前的啊,你最近写过 http协议相关的程序吗?[/quote]
我说过不支持常链接了吗?你仔细看楼主的项目需求了吗?实现一个类似爬虫的程序需要长链接?
yiyefangzhou24 2018-08-03
  • 打赏
  • 举报
回复
vc/mfc是什么板块???
yiyefangzhou24 2018-08-03
  • 打赏
  • 举报
回复
HTTP本身不是基于长链接的,为什么不能断开?两次请求才是正常的请求方式,请仔细学习参考一下爬虫的一些基本原理,一般来说
1、爬虫基本没有用c开发的,效率低下,因为有一些成熟的语言/脚本甚至程序能够实现,参考python、php、ruby、websocket的一些脚本语言,实现你上述的功能只需要短短几行代码,并且方便后期维护和更改,甚至可以使用Linux的curl命令,非常强大(Windows下有对应的程序curl.exehttps://curl.haxx.se/download.html
2、http并非基于socket的常连接,一次请求就是一次请求,一味的要求常链接需要apache开启对应的设定,一般爬虫请求一次之后(比如登陆操作)需要记录下服务器返回的cookie或者phpsession,加入到第二次的请求的请求头中,实现登陆功能。
BAO BAO 2018-08-03
  • 打赏
  • 举报
回复
引用 2 楼 yiyefangzhou24 的回复:
HTTP本身不是基于长链接的,为什么不能断开?两次请求才是正常的请求方式,请仔细学习参考一下爬虫的一些基本原理,一般来说
1、爬虫基本没有用c开发的,效率低下,因为有一些成熟的语言/脚本甚至程序能够实现,参考python、php、ruby、websocket的一些脚本语言,实现你上述的功能只需要短短几行代码,并且方便后期维护和更改,甚至可以使用Linux的curl命令,非常强大(Windows下有对应的程序curl.exehttps://curl.haxx.se/download.html
2、http并非基于socket的常连接,一次请求就是一次请求,一味的要求常链接需要apache开启对应的设定,一般爬虫请求一次之后(比如登陆操作)需要记录下服务器返回的cookie或者phpsession,加入到第二次的请求的请求头中,实现登陆功能。


你这获取的http知识 还存留在 http1.0吧 从http1.1开始 就支持长连接了 服务器默认支持Connection: keep-alive 这样可以在一个连接上发送多次请求 福区旗默认设置是100条。好多网站默认都支持长连接 比如QQ www.qq.com 你尝试发送一个http请求获取主页源码,它返回源码后并不会立即断开,你可以继续发送请求。百度也支持长连接。 说http不支持长连接的 我感觉你们都是在网上随便搜索的信息 那些信息都是多久前的啊,你最近写过 http协议相关的程序吗?
worldy 2018-08-02
  • 打赏
  • 举报
回复
重连接时,改用一个端口号

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧