gpt4 book ai didi

c - getaddrinfo() 返回环回地址

转载 作者:太空宇宙 更新时间:2023-11-04 06:00:27 25 4
gpt4 key购买 nike

我在 LAN 中用于某些套接字通信应用程序的目标机器具有用于 IPv4 的 192.168.98.91

当我尝试使用 getaddrinfo() 解析 IP 地址时,它返回 127.0.0.1

如何获取 192.168.98.91

我在 /etc/hosts 文件中为 myhost 设置了 192.168.98.91 并 ping 我对 myhost 显示 192.168.98.91 作为 IP 地址。

我的机器是CentOS6.4。

这是/etc/hosts 的设置。

192.168.98.91   myhost
127.0.0.1 myhost localhost.localdomain

这是我的代码。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <arpa/inet.h>

int
main(int argc,char *argv[]){
int sock;
struct addrinfo hints,*res;
int n;
int err;
if(argc != 2){
fprintf(stderr,"Usage : %s dst \n",argv[0]);
return 1;
}
memset(&hints,0,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
err = getaddrinfo(argv[1],"12345",&hints,&res);
if(err != 0){
perror("getaddrinfo");
printf("getaddrinfo %s\n",strerror(errno));
printf("getaddrinfo : %s \n",gai_strerror(err));
return 1;
}

sock = socket(res->ai_family,res->ai_socktype,0);
if(sock < 0){
perror("socket");
return 1;
}
{
const char *ipverstr;
switch (res->ai_family){
case AF_INET:
ipverstr = "IPv4";
break;
case AF_INET6:
ipverstr = "IPv6";
break;
default:
ipverstr = "unknown";
break;
}
printf("ipverstr = %s\n ",ipverstr);
}
n = sendto(sock,"HELLO",5,0,res->ai_addr,res->ai_addrlen);
//n = sendto(sock,"HELLO", 5, 0,(struct sockaddr *)addr, sizeof(addr));
if(n<1){
perror("sendto");
{

}
return 1;
}
struct sockaddr_in *addr;
addr = (struct sockaddr_in *)res->ai_addr;
printf("inet_ntoa(in_addr)sin = %s\n",inet_ntoa((struct in_addr)addr->sin_addr));

printf("############ finish !! #######\n");
close(sock);
freeaddrinfo(res);
return 0;
}

最佳答案

如果您使用 struct addrinfoai_next 成员跟踪 getaddrinfo() 返回的结果链,您还会得到192.168.98.91 用于 myhost

在这里http://man7.org/linux/man-pages/man3/getaddrinfo.3.html你会发现一个完整的例子也展示了如何做到这一点:

来自上面的链接:

       ...
s = getaddrinfo(NULL, argv[1], &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}

/* getaddrinfo() returns a list of address structures.
Try each address until we successfully bind(2).
If socket(2) (or bind(2)) fails, we (close the socket
and) try the next address. */

for (rp = result; rp != NULL; rp = rp->ai_next) {
/* Do something with rp->ai_family, rp->ai_socktype, ... */
}
...

/etc/hosts 中的这一行删除 myhost:

127.0.0.1   myhost localhost.localdomain 

将导致 127.0.0.1 在询问 myhost 时不再由 getaddrinfo() 返回。

关于c - getaddrinfo() 返回环回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20211943/

25 4 0