IPv4:无符号32位整型数或者16字节的字符串
- #define INET_ADDRSTRLEN 16
struct sockaddr_in adr_inet; /* AF_INET */
IPv6:16字节的十六进制表示或46字节的字符串
- #define INET6_ADDRSTRLEN 46
struct sockaddr_in6 {
unsigned short intsin6_family; /* AF_INET6 */
__be16 sin6_port; /* Transport layer port # */
__be32 sin6_flowinfo; /* IPv6 flow information */
struct in6_addrsin6_addr; /* IPv6 address */
__u32 sin6_scope_id; /* scope id (new in RFC2553) */
};
下面这两个函数通用在IPv4和IPv6的转换:
- #include<arpa/inet.h>
- int inet_pton(int family, const char *strptr, void *addrptr);
- 返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
- const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
- 返回:若成功则为指向结果的指针, 若出错则为NULL
其他函数说明:
int inet_aton(const char *cp, struct in_addr *inp);//IPv4的点分十进制字符串转换为无符号的32位整型数,返回网络字节序的IP地址
char*inet_ntoa(struct in_addr in);//IPv4无符号整型数转换为点分十进制字符串
inet_addr和 inet_network会认为IP是255.255.255.255为无效的地址。
in_addr_t inet_addr(const char *cp);//IPv4的点分十进制字符串转换为无符号的32位整型数,返回网络字节序
in_addr_t inet_network(const char *cp);//IPv4的点分十进制字符串转换为无符号的32位整型数,返回主机字节序
in_addr_t inet_netof(struct in_addr in);
in_addr_t inet_lnaof(struct in_addr in);
示例:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct in_addr s; // IPv4地址结构体
//int inet_pton(int af, const char *src, void *dst);
inet_pton(AF_INET, "172.16.4.22", (void *)&s);
printf("s.s_addr=%d\n", s.s_addr);
char temp_ip[46] = {0};
s.s_addr = 369365164;
//const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
inet_ntop(AF_INET, (void *)&s, temp_ip, 46);
printf("temp_ip=%s\n", temp_ip);
return 0;
}