webbench-1.5:源码阅读笔记

  • HTTP协议头(发送请求需要)

    • 典型的请求消息:

  GET http://download.microtool.de:80/somedata.exe
  Host: download.microtool.de
  Accept:*/*
  Pragma: no-cache
  Cache-Control: no-cache
  Referer: http://download.microtool.de/
  User-Agent:Mozilla/4.04[en](Win95;I;Nav)
  Range:bytes=554554-
     上例第一行表示HTTP客户端(可能是浏览器、下载程序)通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息,绿色的部分表示通用头部分。


    • Host头域

     Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。


    • Referer头域

     Referer 头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被 追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。


    • Range头域

     Range头域可以请求实体的一个或者多个子范围。例如,
  表示头500个字节:bytes=0-499
  表示第二个500字节:bytes=500-999
  表示最后500个字节:bytes=-500
  表示500字节以后的范围:bytes=500-
  第一个和最后一个字节:bytes=0-0,-1
  同时指定几个范围:bytes=500-600,601-999


  但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。


    • User-Agent头域

     User-Agent头域的内容包含发出请求的用户信息。




  • getopt_long()函数(getopt被用来解析命令行选项参数)

        getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下:


        int getopt_long(int argc, char * const argv[],const char *optstring, const struct option                          *longopts,int *longindex);


    • 函数中的argc和argv通常直接从main()的两个参数传递而来。optsting是选项参数组成的字符串:




      • 单个字符,表示选项,


      • 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。


      • 单个字符后跟两个冒号,表示该选项后可以有参数也可以没有参数。如果有参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。




    • optstring是一个字符串,表示可以接受的参数。例如,"a:b:cd",表示可以接受的参数是a,b,c,d,其中,a和b参数后面跟有更多的参数值。(例如:-a host -b name)



    • 参数longopts,其实是一个结构的实例:
    • struct option {

               const char *name; //name表示的是长参数名
             int     has_arg; //has_arg有3个值,no_argument(或者是0),表示该参数后面不跟参数值required_argument(或者是1),表示该参数后面一定要跟个参数值optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值
                         int *flag;//用来决定,getopt_long()的返回值到底是什么。如果flag是null(通常情况),则函数会返回与该项option匹配的val值;如果flag不是NULL,则将val值赋予flag所指向的内存,并且返回值设置为0。
               int val; //和flag联合决定返回值
                         }

扫描二维码关注公众号,回复: 8131005 查看本文章

    • 参数longindex,表示当前长参数在longopts中的索引值。
    • 给个例子:

struct option long_options[] = {
{"a123", required_argument, 0, 'a'},
{"c123", no_argument, 0, 'c'},
}


    • 现在,如果命令行的参数是-a 123,那么调用getopt_long()将返回字符'a',并且将字符串123由optarg返回(注意注意!字符串123由optarg带回!optarg不需要定义,在getopt.h中已经有定义),那么,如果命令行参数是-c,那么调用getopt_long()将返回字符'c',而此时,optarg是null。最后,当getopt_long()将命令行所有参数全部解析完成后,返回-1。




  • shutdown()函数

     #include<sys/socket.h>
     int shutdown(int sockfd,int how);
     该函数的行为依赖于how的值
     1.SHUT_RD:值为0,关闭连接的读这一半。
     2.SHUT_WR:值为1,关闭连接的写这一半。
     3.SHUT_RDWR:值为2,连接的读和写都关闭。
     4.终止网络连接的通用方法是调用close函数。但使用shutdown能更好的控制断连过程(使用第二个参数)。

  • 其他不常用函数

strncasecmp():略过字母大小写比较大小;
     stevbuf():
          int setvbuf(FILE *stream, char *buf, int type, unsigned size);

         _IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
          _IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
          _IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
          size : 缓冲区内字节的数量。
          注意:This function should be called once the file associated with the stream has already been opened but before any input or output operation has taken place.
     
     接下来详细分析代码主要函数:
    一、build_request函数
          目的是对url进行处理,得到host,proxyport,request
          其中request就是之后利用socket与host通信所要发送的报文。
     二、bench函数
          该函数主要采用fork出子进程来测试网站,并且利用主进程来读取所有子进程写入的数据,
          每个子进程调用benchcore函数来测试存到全局变量speed faulted
     三、benchcore函数
          该函数主要采用socket连接、发送request、接收来测试网站,测试结果存在全局变量speed faulted,bytes
          定时时间结束则退出函数

猜你喜欢

转载自www.cnblogs.com/shessh/p/12014350.html
今日推荐