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) {

我正在设计一对c程序,它使用基本的流套接字在两个程序之间进行通信,类似于服务器-客户机交互。大多数程序似乎工作正常,但系统的客户端不断报告一个我无法完全解决的错误

客户机程序一旦编译,就会使用命令行参数执行,据我所知,该参数应该是服务器程序的名称。但是,每次我运行以下行

./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