我将如何编写(用 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 的范围是正确的;我们不再需要任何检查。错误消息包含原始字符串,这可能是也可能不是向用户报告问题的最佳方式。