gpt4 book ai didi

c - 如何从 getaddrinfo() 打印 IP 地址

转载 作者:太空狗 更新时间:2023-10-29 14:55:03 29 4
gpt4 key购买 nike

我正在尝试在 CentOS 6.4 上使用 C 中的套接字。

LIST1 之后是我的代码。

我的代码从命令行获取主机名并使用 UDP 成功将数据报发送到服务器。

我想知道的是如何打印 getaddrinfo()192.168.10.1 格式解析的 IP 地址。

当我尝试打印 IP 地址段错误时发生。

有谁知道如何修复这段代码?

#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>

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);
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;
}

最佳答案

代码没有包含 inet_ntoa() 的原型(prototype).

编译器应该已经告诉你了。

添加:

#include <arpa/inet.h>

然而,由于缺少 inet_ntoa() 的原型(prototype),代码仍然可以编译。假定返回 int,而它返回一个 char*,它是一个指针,在 64 位系统上是 8 个字节,与 的大小不同>int,通常大小为 4。由于这种不匹配,事情变得非常错误并最终导致分段违规。


另请注意:inet_ntoa()仅用于 ipv4 地址。来自 man inet_ntoa 的逐字记录(我用斜体字):

The inet_ntoa() function converts the Internet host address in, given in network byte order, to a string in IPv4 dotted-decimal notation. The string is returned in a statically allocated buffer, which subsequent calls will overwrite


为了能够将(IPv4 和 IPv6)struct sockaddr_XYZ 的二进制地址转换为 char[],请使用 inet_ntop() .

关于c - 如何从 getaddrinfo() 打印 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115295/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com