18.2.2 SHTTPD命令行解析的分析设计

18.2.2  SHTTPD命令行解析的分析设计

服务器SHTTPD的命令行解析,需要进行大量的命令行字符串解析,程序设计起来比较麻烦。

1getopt_long()函数介绍

幸好,GNU C库有一个命令行解析函数。使用此函数可以节省大量的时间,将主要的思想用在业务处理上。使用gccgetopt_long()函数可以自动地进行命令行解析程序设计。使用getopt_long()需要引入头文件getopt.h。其函数的声明如下:

 

#include <getopt.h>

int getopt_long(int argc, char * const argv[], const char *optstring, 

const struct option *longopts, int *longindex);

 

参数说明:

q      参数argc:表示输入参数的个数,与参数argv通常都是从main()函数的输入参数中直接传递过来的。

q      参数argv:表示输入参数的字符串数组。

q      参数optstring:是选项组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。例如,某个命令的选项字符串为c:h,则可以使用-c xxx这种带参数的选项,而-h选项不需要参数。

q      参数longopts:是长参数选项,下一个是指向数组的指针,这个数组是option结构数组,option结构称为长选项表。其声明如下:

 

struct option

 {

    const char *name;

    int  has_arg;

    int  *flag;

    int  val;

};

 

结构中的元素解释如下:

q      参数name:选项名,即进行参数判定时的匹配字符串。

q      参数 has_arg:描述长选项是否有参数,其值见表18.2

18.2  结构option的成员flag的含义

数值

   

         no_argument

0

          选项没有参数

         required_argument

1

          选项需要参数

         optional_argument

2

          选项参数是可选的

 

q      参数flag,如果该指针为NULL,那么getopt_long()函数返回的为对应val字段的值;如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0

q      参数 val,如果flagNULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项参数相同。

2SHTTPD中的命令行选项定义

如图18.7所示为SHTTPD服务器命令行解析的含义,其长参数、短参数匹配字符和含义如表18.3所示。

18.3  SHTTPD服务器命令行解析的含义

长参数字符串

短参数字符串

   

--CGIRoot

-c

c

CGI根路径

--DefaultFile

-d

d

目录下默认文件

--ConfigFile

-f

f

配置文件名称

--DocumentRoot

-o

o

网站根目录

--ListenPort

-l

l

服务器侦听端口

--MaxClient

-m

m

最大客户端数量

--TimeOut

-t

t

连接超时时间

--Help

-h

h

帮助

 

设置如下形式的参数来提供命令行参数选项的解析,其中短参数类型为:

 

"c:d:f:ho:l:m:t:";

 

对应的长参数类型为:

 

{"CGIRoot",         required_argument, NULL, 'c'},

{"ConfigFile",      required_argument, NULL, 'f'}, 

{"DefaultFile",     required_argument, NULL, 'd'}, 

{"DocumentRoot",    required_argument, NULL, 'o'},

{"ListenPort",      required_argument, NULL, 'l'},

{"MaxClient",       required_argument, NULL, 'm'}, 

{"TimeOut",         required_argument, NULL, 't'},

你可能感兴趣的:(c,struct,gcc,服务器,null)