命令行参数解析 getopt_long

4 篇文章 0 订阅

代码摘录于webbench 的源代码

static void usage(void) {
    fprintf(stderr, "webbench [option]... URL\n"
                    "  -f|--force               Don't wait for reply from server.\n"
                    "  -r|--reload              Send reload request - Pragma: no-cache.\n"
                    "  -t|--time <sec>          Run benchmark for <sec> seconds. Default "
                    "30.\n"
                    "  -p|--proxy <server:port> Use proxy server for request.\n"
                    "  -c|--clients <n>         Run <n> HTTP clients at once. Default one.\n"
                    "  -9|--http09              Use HTTP/0.9 style requests.\n"
                    "  -1|--http10              Use HTTP/1.0 protocol.\n"
                    "  -2|--http11              Use HTTP/1.1 protocol.\n"
                    "  --get                    Use GET request method.\n"
                    "  --head                   Use HEAD request method.\n"
                    "  --options                Use OPTIONS request method.\n"
                    "  --trace                  Use TRACE request method.\n"
                    "  -?|-h|--help             This information.\n"
                    "  -V|--version             Display program version.\n");
};


static const struct option long_options[] = {
    // long option entry: name - 是否有参数 -
    // 如果flag即第三个参数 为 NULL 则 getopt_long 返回第四个参数val
    // 如果flag 不是NULL.则getopt_long 返回0并且将flag 设置为val
    {"force", no_argument, &force, 1},// 长参数名为force 没有参数 getopt_long 返回0 且将force 设置为1
    {"reload", no_argument, &force_reload, 1},// 长参数名为reload 没有参数 getopt_long 返回0 且将force_reload 设置为1
    {"time", required_argument, NULL, 't'},// 长参数名为time 需要参数 getopt_long 返回t
    {"help", no_argument, NULL, '?'},
    {"http09", no_argument, NULL, '9'},
    {"http10", no_argument, NULL, '1'},
    {"http11", no_argument, NULL, '2'},
    {"get", no_argument, &method, METHOD_GET},  // will set method to be METHOD_GET because the third argument
                                                // is NULL
    {"head", no_argument, &method, METHOD_HEAD},
    {"options", no_argument, &method, METHOD_OPTIONS},
    {"trace", no_argument, &method, METHOD_TRACE},
    {"version", no_argument, NULL, 'V'},
    {"proxy", required_argument, NULL, 'p'},
    {"clients", required_argument, NULL, 'c'},
    {NULL, 0, NULL, 0}};


int main(int argc, char* argv[]) {
    int opt = 0;
    int options_index = 0;
    char* tmp = NULL;

    if (argc == 1) {
        usage();
        return 2;
    }

    // optarg : option argument
    // optint : option index
    while ((opt = getopt_long(argc, argv, "912Vfrt:p:c:?h", long_options, &options_index)) != EOF) {
        switch (opt) {
            case 0: break;
            case 'f': force = 1; break;
            case 'r': force_reload = 1; break;
            // specify http version
            case '9': http10 = 0; break;
            case '1': http10 = 1; break;
            case '2': http10 = 2; break;
            case 'V': printf(PROGRAM_VERSION "\n"); exit(0);
            case 't': benchtime = atoi(optarg); break;
            case 'p':
                /* proxy server parsing server:port */
                tmp = strrchr(optarg, ':');
                proxyhost = optarg;
                if (tmp == NULL) {
                    break;
                }
                if (tmp == optarg) {
                    fprintf(stderr, "Error in option --proxy %s: Missing hostname.\n", optarg);
                    return 2;
                }
                if (tmp == optarg + strlen(optarg) - 1) {
                    fprintf(stderr, "Error in option --proxy %s Port number is missing.\n", optarg);
                    return 2;
                }
                *tmp = '\0';
                proxyport = atoi(tmp + 1);
                break;
            // usage
            case ':':
            case 'h':
            case '?':
                usage();
                return 2;
                break;
            case 'c': clients = atoi(optarg); break;
        }
    }

    if (optind == argc) {
        fprintf(stderr, "webbench: Missing URL!\n");
        usage();
        return 2;
    }

    if (clients == 0)
        clients = 1;
    if (benchtime == 0)
        benchtime = 60;
    /* Copyright */
    fprintf(stderr, "Webbench - Simple Web Benchmark " PROGRAM_VERSION "\n"
                    "Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.\n");

    // 2. build http request
    build_request(argv[optind]);
    /* print bench info */
    printf("\nBenchmarking: ");
    switch (method) {
        case METHOD_GET:
        default: printf("GET"); break;
        case METHOD_OPTIONS: printf("OPTIONS"); break;
        case METHOD_HEAD: printf("HEAD"); break;
        case METHOD_TRACE: printf("TRACE"); break;
    }
    printf(" %s", argv[optind]);
    switch (http10) {
        case 0: printf(" (using HTTP/0.9)"); break;
        case 2: printf(" (using HTTP/1.1)"); break;
    }
    printf("\n");
    if (clients == 1) {
        printf("1 client");
    } else {
        printf("%d clients", clients);
    }

    printf(", running %d sec", benchtime);
    if (force){
        printf(", early socket close");
    }
    if (proxyhost != NULL){

        printf(", via proxy server %s:%d", proxyhost, proxyport);
    }
    if (force_reload){
        printf(", forcing reload");
    }
    printf(".\n");
    return bench();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值