当前位置:  开发笔记 > IOS > 正文

从sockaddr结构获取IPV4地址

如何解决《从sockaddr结构获取IPV4地址》经验,为你挑选了4个好方法。

如何将IP地址提取到字符串中?我找不到一个参考,告诉我如何char sa_data[14]编码.



1> Emil H..:

只需将整个sockaddr结构转换为sockaddr_in即可.然后你可以使用:

char *ip = inet_ntoa(their_addr.sin_addr)

检索标准ip表示.


+1.根据平台,请记得先检查一下家人.可能没有要提取的IPV4地址......
`if(their_sockaddr_ptr-> sa_family == AF_INET){struct sockaddr_in*their_inaddr_ptr =(struct sockaddr_in*)their_sockaddr_ptr; } else {/*不是IPv4地址*/}`或类似的.

2> jrc..:

inet_ntoa()适用于IPv4; inet_ntop()适用于IPv4和IPv6.

给定输入struct sockaddr *res,这里有两段代码:

使用inet_ntoa()

struct sockaddr_in *addr_in = (struct sockaddr_in *)res;
char *s = inet_ntoa(addr_in->sin_addr);
printf("IP address: %s\n", s);

使用inet_ntop()

char *s = NULL;
switch(res->sa_family) {
    case AF_INET: {
        struct sockaddr_in *addr_in = (struct sockaddr_in *)res;
        s = malloc(INET_ADDRSTRLEN);
        inet_ntop(AF_INET, &(addr_in->sin_addr), s, INET_ADDRSTRLEN);
        break;
    }
    case AF_INET6: {
        struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)res;
        s = malloc(INET6_ADDRSTRLEN);
        inet_ntop(AF_INET6, &(addr_in6->sin6_addr), s, INET6_ADDRSTRLEN);
        break;
    }
    default:
        break;
}
printf("IP address: %s\n", s);
free(s);



3> John..:

埃米尔的答案是正确的,但我的理解inet_ntoa是弃用了,而你应该使用inet_ntop.如果您使用的是IPv4,请struct sockaddr转到sockaddr_in.您的代码看起来像这样:

struct addrinfo *res;   // populated elsewhere in your code
struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
char ipAddress[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(ipv4->sin_addr), ipAddress, INET_ADDRSTRLEN);

printf("The IP address is: %s\n", ipAddress);

请查看这个优秀的资源以获得更多解释,包括如何为IPv6地址执行此操作.



4> Amber..:

一旦sockaddr投出sockaddr_in,它就变成了:

struct sockaddr_in {
    u_short     sin_family;
    u_short     sin_port;
    struct      in_addr sin_addr;
    char        sin_zero[8];
};

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有