IP地址转换总结

原文链接:IP地址转换总结
发布时间:2017-03-08 22:33:56

一、IP地址结构体相关定义

本文只讨论IPv4的情况,IPv6的相关转换,在项目中我也使用过,基本类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
in_addr_t inet_addr(const char *cp);  /*返回网络字节序*/

in_addr_t inet_network(const char *cp); /*返回主机字节序*/

它们都有一个小缺陷,当转换”255.255.255.255”会失败,认为这个地址无效。

1
int inet_aton(const char *string, struct in_addr*addr);/*addr是传出参数,将得到网络字节的整数IP*/

这个函数比上面两个函数更完善,建议IPv4使用这个函数。

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

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

三、将整数IP转换为点分十进制字符串IP

1
2
3
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版本,注意缓冲区的长度。