6

我有以下用于获取主机名和 IP 地址的代码,

#include <stdlib.h>
#include <stdio.h>
#include <netdb.h> /* This is the header file needed for gethostbyname() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>


int main(int argc, char *argv[])
{
struct hostent *he;

if (argc!=2){
printf("Usage: %s <hostname>\n",argv[0]);
exit(-1);
}

if ((he=gethostbyname(argv[1]))==NULL){
printf("gethostbyname() error\n");
exit(-1);
}

printf("Hostname : %s\n",he->h_name); /* prints the hostname */
printf("IP Address: %s\n",inet_ntoa(*((struct in_addr *)he->h_addr))); /* prints IP address */
}

但我在编译过程中收到警告:

$cc host.c -o host
host.c: In function ‘main’:
host.c:24: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

然后在我运行代码时出现分段错误:

./host 192.168.1.4
Hostname : 192.168.1.4
Segmentation fault

代码中的错误是什么?

4

5 回答 5

8

我有一个类似的代码(如果不一样),它在我们学校实验室的一台机器上编译得很好,但是当我在家里的机器上编译它时,它有同样的错误(我没有编辑代码)。我阅读了 的手册页inet,发现我缺少一个头文件,即#include <arpa/inet.h>. 在我将该头文件添加到我的 C 程序后,它编译并运行良好。

于 2011-09-22T18:48:04.497 回答
6

关于 printf 格式不匹配的警告是一个重要的警告。在这种情况下,它的出现是因为编译器认为该函数inet_ntoa返回一个int,但您指定期望格式字符串中的字符串。

for 不正确的返回类型inet_ntoa是旧 C 规则的结果,该规则指出,如果您尝试使用没有事先声明的函数,则编译器必须假定该函数返回 anint并采用未知(但固定)数量的参数。假定的返回类型与函数的实际返回类型之间的不匹配会导致未定义的行为,这在您的情况下表现为崩溃。

解决方案是为inet_ntoa.

于 2010-08-25T15:37:15.800 回答
1

打破这段代码:

printf("IP Address: %s\n",inet_ntoa(*((struct in_addr *)he->h_addr)));

进入这个:

struct in_addr* address = (in_addr*) he->h_addr;
char* ip_address = inet_ntoa(*address);
printf("IP address: %s\n", ip_address);

它还使调试和查明问题变得更加容易。

于 2010-09-12T14:18:22.427 回答
0

实际上,我只是在家里的 FreeBSD 机器上编译了该代码,并且它可以工作。

于 2010-05-25T17:34:57.640 回答
0

he->h_addr您可以尝试在尝试取消引用之前转储 的值并将其传递给inet_ntoa. 如果是NULL,那将导致段错误。

运行它怎么样strace

于 2010-05-25T20:11:38.390 回答