IP地址转换总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KentZhang_/article/details/51429025

一、IP地址结构体相关定义
本文只讨论IPv4的情况,IPv6的相关转换,在项目中我也使用过,基本类似。
struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};
struct in_addr {
    in_addr_t s_addr;
};

in_addr_t 是32位无符号数。



二、将点分十进制的字符串IP转换为整数IP
in_addr_t inet_addr(const char *cp);  /*返回网络字节序*/
in_addr_t inet_network(const char *cp); /*返回主机字节序*/
它们都有一个小缺陷,当转换“255.255.255.255”会失败,认为这个地址无效。

int inet_aton(const char *string, struct in_addr*addr);/*addr是传出参数,将得到网络字节的整数IP*/
这个函数比上面两个函数更完善,建议IPv4使用这个函数。

int inet_pton(int af, const char *src, void *dst);/*dst是传出参数,是in_addr的地址,得到网络字节序*/

这个函数支持IPv4和IPv6版本,由参数af来确定是哪个IP版本,取值为AF_INET和AF_INET6.



三、将整数IP转换为点分十进制字符串IP
char* inet_ntoa(struct in_addr in); /*in是网络字节序,该函数线程不安全,尽量少用*/
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);/*src是in_addr地址,是网络字节序*/
也是支持IPv4和IPv6版本,注意缓冲区的长度。

猜你喜欢

转载自blog.csdn.net/KentZhang_/article/details/51429025