当前位置: 主页 > 日志 > 原创程序 >

HTTP报文提交工具

程序功能很简单,类似于"nc.exe -vv ip 80 http报文文件路径"。


//HTTP报文提交工具 By RedIce
#include <winsock2.h> //Winsock API头文件
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib") //Winsock API连接库文件
char http_data[6000];//http报文缓冲区
char recvbuf[200];//接收缓冲区
void usage();//函数声明-程序使用说明
void main(int argc,char *argv[])
{
    char *ICMP_DEST_IP;//目标主机IP
    FILE * fileopr;
    WSADATA wsaData;
    SOCKET sender;
    char thecurrentpath[200];//当前程序所在的路径
    struct sockaddr_in dest;
    PHOSTENT hostinfo;//主机信息(域名->IP)
    int n=1; //发送数据包次数
    int i;
    int ret;
    int timeout=2000;//超时
    int filesize;//HTTP报文文件大小
    char httpfile[200];//HTTP报文所在的文件
    int getreturn=1;/*是否回显服务器返回的数据
                   false表示不显示,true表示显示
                   当n>1时,getreturn强制为false
                   */    
    //命令行参数处理
    memset(httpfile,0,200);
    if(1==argc)//如果只有默认的命令行参数 则给出程序说明 并退出程序
    {
        usage();
        return;
    }
    else//如果有多个参数
    {
        for(i=1;i<=argc-1;i++)
        {
            if(strstr(argv[i],"-r"))
            {
                getreturn=1;
            }
            if(strstr(argv[i],"-t"))
            {
                n=atoi(argv[i+1]);
                if(n<0)
                {
                    printf("-n 参数必须大于0 ");
                    return;
                }
                i++;
            }
            if(strstr(argv[i],"-f"))
            {
               if(strlen(argv[i+1])>=200)
               {
                   printf("指定的文件名太长! ");
                   return;
               }
               strcpy(httpfile,argv[i+1]);
               i++;
            }
            if(strstr(argv[i],"-?"))
            {
                usage();
                return;
            }
        }
    }

    ICMP_DEST_IP=argv[argc-1];//取得域名(IP)
    if(n>1)//如果-n参数大于1则不回显服务器返回的数据
    {
        getreturn=0;
    }
    //如果用户指定了http报文路径则读取文件中的内容,否则使用默认报文
    memset(http_data,0,6000);
    if(strlen(httpfile))
    {
        if(!strstr(httpfile,"\"))//如果是当前路径
        {
            memset(thecurrentpath,0,200);
            for(i=strlen(argv[0])-1;i>=0;i--)
            {
                if(*(argv[0]+i)==\) break;//如果找到则跳出
            }
            memcpy(thecurrentpath,argv[0],i+1);
            //判断当前路径最后一个字符是否为
            if(thecurrentpath[strlen(thecurrentpath)-1]!=\)
            {
                thecurrentpath[strlen(thecurrentpath)]=\;
            }
            strcat(thecurrentpath,httpfile);
            memset(httpfile,0,200);
            strcpy(httpfile,thecurrentpath);
        }
        //读取文件中的报文
        fileopr=fopen(httpfile,"r");//以只读的方式打开文件
        if(NULL==fileopr)
        {
            printf("打开文件失败,请检查文件的路径是否正确!%s ",httpfile);
            return;
        }
        //取得文件大小
        if(fseek(fileopr,0,SEEK_END))
        {
            printf("计算文件大小失败! ");
            return;
        }
        filesize=ftell(fileopr);
        if(filesize<=0||filesize>6000)
        {
            printf("文件大小有误(不能为空且不能大于6000Bytes)! ");
            return;
        }
        if(fseek(fileopr,0,SEEK_SET))
        {
            printf("计算文件大小失败! ");
            return;
        }
        if(!fread(http_data,sizeof(char),6000,fileopr))
        {
            printf("读取HTTP报文文件失败! ");
            return;
        }
        fclose(fileopr);//关闭打开的文件
    }
    else
    { 
        //默认的报文
           //GET / HTTP/1.1
        //Accept: */*
        //Accept-Language: zh-cn
        //Host: 你输入的域名(IP地址)
        //Connection: Keep-Alive
        strcpy(http_data,"GET / HTTP/1.1 Accept: */* Accept-Language: zh-cn Host: ");
        strcat(http_data,ICMP_DEST_IP);
        strcat(http_data," Connection: Keep-Alive ");
    }
   //套接字版本协商
   if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
   {
       printf("初始化套接字失败! ");
       return;
   }

    //域名解析
    hostinfo=gethostbyname(ICMP_DEST_IP); //参数为需要解析的主机名
    if(NULL==hostinfo)
    {
        printf("无法解析主机%s的IP地址!",ICMP_DEST_IP);
        WSACleanup();
        return;
    }
    else
    {
        ICMP_DEST_IP=inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list);
    }

   //创建流式套接字
   sender=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   if(INVALID_SOCKET==sender)
   {
       printf("创建套接字失败! ");
       WSACleanup();
       return;
   }
   //设置接收超时
   if(SOCKET_ERROR ==setsockopt(sender,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)))
    {
        printf("设置套接字超时失败! ");
        closesocket(sender);
        WSACleanup();
        return;
    }
   //填充目的地址结构体
    dest.sin_family=AF_INET;
    dest.sin_addr.S_un.S_addr =inet_addr(ICMP_DEST_IP);
    dest.sin_port=htons(80);
    if(SOCKET_ERROR==connect(sender,(SOCKADDR *) &dest,sizeof(dest)))    
    {
        printf("连接目的主机失败! ");
        closesocket(sender);
        WSACleanup();
        return;
    }
    printf("提交报文: %s ",http_data);
    for(i=1;i<=n;i++)
    {
        if(SOCKET_ERROR==send(sender,http_data,strlen(http_data),0))
        {
            printf("发送数据出错! ");
            closesocket(sender);
            WSACleanup();
            return;
        }
        else
        {
            printf("已提交报文%d次 ",i);
        }
    }
    if(getreturn)//接收服务器发送的数据
    {    
        printf(" 服务器返回的报文: %s ",recvbuf);
        while(1)//循环接收数据
        {    memset(recvbuf,0,200);
            ret=recv(sender,recvbuf,200,0);
            if(-1==ret) 
                break;//返回-1表示接收完毕
            else
            {
                printf("%s",recvbuf);
            }
        }
    }
    printf(" ");
    //关闭套接字
    closesocket(sender);
    WSACleanup();
    return;
}

//程序使用说明
void usage()
{
    printf("HTTP报文提交工具 ");
    printf("By RedIce ");
    printf("E-mail:redice@see.xidian.edu.cn ");
    printf("http:\redice.1.suhai.com.cn ");
    printf("Usage: SendHttp.exe [-n] [-r] [-f] 目的主机(域名/IP地址) ");
    printf("Options: ");
    printf("        -n 指定发送报文的次数,这个参数用来灌水很不错 ");
    printf("        -r 如果有该参数 程序将显示服务器返回的报文信息 ");    
    printf("           注意:如果-n参数指定的值大于1,-r将被忽略 ");
    printf("        -f 指定HTTP数据包文所在的文件 ");
    printf("           注意:如果不指定该参数,程序将使用默认报文:GET / HTTP/1.1 ");
    printf("        -? 显示该帮助信息 ");
}


附源代码:

File: Click to Download

 

[日志信息]

该日志于 2009-02-26 13:35 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “HTTP报文提交工具” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部