c - 命令行参数

我将如何编写(用 C 语言)接受一个命令行参数的程序(包括程序名称和将用于程序的端口号)。如果未指定参数或小于 1024,它将返回 -1?

然后它将启动所需的套接字操作以创建和绑定套接字。

干杯

回答1

#include<stdio.h>
#include<stdlib.h>
  
int main(int argc,char* argv[]){
    // printf("asdasdasdasd");
    // yo can capture program name as below
    // printf("Program Name Is : %s",argv[0]);
    if(argc==1){
        return(514);
    };
    if(argc>=2){
        int port = atoi(argv[1]);
        if(port<1024){
            return(514);
        }
        else{
            return(513);
        }
    }
    // printf("asdsads");
    return 0;
}

main返回value一般用于表示执行状态。main返回的maxvalue限制为512。如果尝试返回大于512的value,例如513,会得到1作为回报。如果您返回 514,您将得到 2 作为返回 value。执行后运行echo $?可以看到返回value。见下文:

gcc -o main main.c
echo $?

假设您的程序名称是 main.c。而不是返回 -1 yo 可以通过轻松地返回一个整数来检查状态。

回答2

#include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>

    int main(int argc, char **argv) {
        // FIXME check for argc < 2
        uint16_t port = (uint16_t)atoi(argv[1]);
        if (port < 1024) {
            fprintf(stderr, "Port %s is less than 1024, cannot proceed.", argv[1]);
            return 3;
        }
    }

好的,让我们开始拆包。

首先,将第一个参数转换为整数。然后将其转换为无符号 int16。 (这恰好在我查看的一个 16 位平台上正常工作,但我不知道它是否有保证。它绝对适用于所有 32 或 64 位平台。)

端口总是无符号的 16 位整数;因此范围从 0 到 65535;但是 0 在 BSD 套接字中不可用,因此范围实际上是 1 到 65535。

从那里,我们只需检查它是否小于 1024;如果是错误消息。由于 uint16_t 的范围是正确的;我们不再需要任何检查。错误消息包含原始字符串,这可能是也可能不是向用户报告问题的最佳方式。

相似文章

随机推荐

最新文章