因特网程序使用inet_aton、inet_addr(已废弃)和inet_ntoa函数实现IP地址和点分十进制串之间的转换。
函数原型
#include <arpa/inet.h>
/*将一个点分十进制串转换位网络字节顺序的IP地址,字符串有效返回1,否则为0*/
int inet_aton(const char *cp,struct in_addr *inp);
/*若字符串有效则返回32位二进制网络序IPv4地址,否则为INADDR_NONE*/
in_addr_t inet_addr(const char *cp);
/*将一个网络字节顺序的IP地址转换位它所对应的点分十进制串*/
char *inet_ntoa(struct in_addr in);
缩写释义
arpa貌似是ARPANEAT(阿帕网)的缩写。
n表示network(网络)或numeric(数值)
a表示application(应用)
inet_addr存在一些问题,所以已被废弃。新的代码都改用inet_aton函数来代替。
参数
注意,函数中的参数都是地址(in_addr)而不是套接字地址结构!
inet_aton和inet_nota两个函数的参数中都有32位二进制网络序IPv4地址。不同的是:
- inet_aton的参数的是指向in_addr结构的指针。(因为这是要返回的)
- 而inet_ntoa的参数是in_addr结构本身。(因为这个是要传入的)
随着IPv6的出现,产生了两个新的函数:inet_pton和inet_ntop。它们对于IPv4和IPv6都适用。
名称中的:
- n表示numeric(数值)
- p表示presentation(表达)
完成从数值类型到表达格式之间的转换。所谓表达格式就是IPv4中的点分十进制;IPv6中的冒号分十六进制。
函数原型
#include <arpa/inet.h>
int inet_pton(int af, const char *strptr, void *addrptr);
const char *inet_ntop(int af, const void *addrptr,
char *strptr, socklen_t len);
参数
void *ddrptr
,即地址结构(in_addr或in6_addr)
和前面讨论的三个函数相比,这两个函数的参数中的地址均是指针(inet_aton参数中地址的是指针,但inet_ntoa参数中的地址是结构本身)
char *strptr
,就是要传入或返回的表达格式。它不可以是一个空指针。
len实际是size_t类型,它的值可以使用以下两个宏:
#define INET_ADDRSTRLEN 16 /* IPv4 */
#define INET6_ADDRSTRLEN 46 /* IPv6 */