C 未传入命令行参数
我正在设计一对c程序,它使用基本的流套接字在两个程序之间进行通信,类似于服务器-客户机交互。大多数程序似乎工作正常,但系统的客户端不断报告一个我无法完全解决的错误 客户机程序一旦编译,就会使用命令行参数执行,据我所知,该参数应该是服务器程序的名称。但是,每次我运行以下行C 未传入命令行参数,c,null,command-line-arguments,C,Null,Command Line Arguments,我正在设计一对c程序,它使用基本的流套接字在两个程序之间进行通信,类似于服务器-客户机交互。大多数程序似乎工作正常,但系统的客户端不断报告一个我无法完全解决的错误 客户机程序一旦编译,就会使用命令行参数执行,据我所知,该参数应该是服务器程序的名称。但是,每次我运行以下行 ./client server 我得到一个只有在argv[1]为null时才会报告的错误。下面是string_client.c中的代码: if ((he=gethostbyname(argv[1])) == NULL) {
./client server
我得到一个只有在argv[1]为null时才会报告的错误。下面是string_client.c中的代码:
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
perror("gethostbyname");
printf("%s", argv[1]);
exit(1);
}
server只是string_server.c中的可执行文件,它应该等待来自客户机的传入请求并接收来自客户机程序的输入(据我所知,它的工作方式是这样的)。我不确定gethostbyname方法,但由于提供了该代码,我还没有对它提出质疑
而且,每当我试着打印argv[1]时,它就会显示为“la”。。。不知道那里发生了什么。命令行是怎么回事?我只是使用了错误的参数吗?给你:
#include <stdio.h>
#include <netdb.h>
extern int h_errno;
int main(int argc, char **argv)
{
struct hostent *he;
if(argc < 2)
{
printf("usage: %s hostname\n", argv[0]);
return 255;
}
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
perror("gethostbyname");
printf("%s", argv[1]);
return 1;
}
printf("%s resolved to %u.%u.%u.%u\n", argv[1],
(unsigned char)(he->h_addr_list[0][0]),
(unsigned char)(he->h_addr_list[0][1]),
(unsigned char)(he->h_addr_list[0][2]),
(unsigned char)(he->h_addr_list[0][3]));
return 0;
}
首先,在访问
argv
中的任何内容之前,应始终检查argc
的值。给定您发布的命令行,argc
应该是2,argv[1]
应该是“服务器”。我建议从精简版的main
开始,只要检查argc
并在可用时打印argv[1]
。一旦你开始工作,你就可以继续做更大更好的事情。而且,gethostbyname
需要主机名,然后它会将主机名传递到DNS服务器以转换为IP地址。例如,www.google.com
将是传递给gethostbyname
的有效字符串,并将返回google的IP地址列表。如果是这样,我相信我已经为客户端提供了ring参数。有没有办法通过命令行找出主机的名称?我在同一台机器上运行这两个程序,但实际上我正在通过SSH外壳在远程服务器上访问它们。@文森特:机器总是可以使用名称localhost
或127.0.0.1
访问自己。哈,现在它可以工作了!非常感谢,非常感谢。
$ gcc -Wall -o gethost gethost.c
$ ./gethost
usage: ./gethost hostname
$ ./gethost google.com
google.com resolved to 173.194.40.196
$ ./gethost localhost
localhost resolved to 127.0.0.1