Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从getaddrinfo()打印IP地址_C_Sockets - Fatal编程技术网

C 如何从getaddrinfo()打印IP地址

C 如何从getaddrinfo()打印IP地址,c,sockets,C,Sockets,我正在尝试在CentOS 6.4上使用C中的套接字 下面的列表1是我的代码 我的代码从命令行获取主机名,并使用UDP成功地将数据报发送到服务器 我想知道的是如何打印用192.168.10.1格式解析的getaddrinfo()IP地址 当我试图打印IP地址分段错误发生 有人知道如何修复此代码吗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h&

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

下面的列表1是我的代码

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

我想知道的是如何打印用
192.168.10.1
格式解析的
getaddrinfo()
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int
main(int argc,char*argv[]){
int袜子;
结构addrinfo提示,*res;
int n;
INTERR;
如果(argc!=2){
fprintf(stderr,“用法:%s dst\n”,argv[0]);
返回1;
} 
memset(&hints,0,sizeof(hints));
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_DGRAM;
err=getaddrinfo(argv[1]、“12345”、&提示和res);
如果(错误!=0){
perror(“getaddrinfo”);
printf(“getaddrinfo%s\n”,strerror(errno));
printf(“getaddrinfo:%s\n”,gai_strerror(err));
返回1;
}
sock=socket(res->ai_族,res->ai_socktype,0);
if(sock<0){
佩罗(“插座”);
返回1;
const char*ipverstr;
开关(res->ai_系列){
案例分析:
ipverstr=“IPv4”;
打破
案例6:
ipverstr=“IPv6”;
打破
违约:
ipverstr=“未知”;
打破
}
printf(“ipverstr=%s\n”,ipverstr);
}
n=sendto(sock,“HELLO”,5,0,res->ai_addr,res->ai_addrlen);
如果(地址:;
printf(“inet_ntoa(in_addr)sin=%s\n”,inet_ntoa((struct in_addr)addr->sin_addr));
printf(“完成!!”;
关闭(袜子);
freeaddrinfo(res);
返回0;
}

代码未包含的原型

编译器应该告诉您这一点。

请添加:

#include <arpa/inet.h>
#include假设返回
int
,而它返回一个
char*
,它是一个指针,在64位系统上是8个字节,与
int
的大小不同,后者的大小通常为
4
。由于这种不匹配,情况会严重出错,最终导致分段冲突


另请注意:仅用于ipv4地址。逐字(我用斜体):

inet\u ntoa()函数将以网络字节顺序给出的Internet主机地址转换为IPv4虚线十进制表示法的字符串。该字符串返回到静态分配的缓冲区中,随后的调用将 覆盖



要能够将(IPv4和IPv6)
struct sockaddr_XYZ
的二进制地址转换为
char[]
使用。

getaddrinfo()
对应的是。这将
struct sockaddr
转换为字符串。

我现在添加了它并获得了IP地址。