因特网程序使用inet_atoninet_addr(已废弃)和inet_ntoa函数实现IP地址和点分十进制串之间的转换。

函数原型

  1. #include <arpa/inet.h>
  2. /*将一个点分十进制串转换位网络字节顺序的IP地址,字符串有效返回1,否则为0*/
  3. int inet_aton(const char *cp,struct in_addr *inp);
  4. /*若字符串有效则返回32位二进制网络序IPv4地址,否则为INADDR_NONE*/
  5. in_addr_t inet_addr(const char *cp);
  6. /*将一个网络字节顺序的IP地址转换位它所对应的点分十进制串*/
  7. 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中的冒号分十六进制。

函数原型

  1. #include <arpa/inet.h>
  2. int inet_pton(int af, const char *strptr, void *addrptr);
  3. const char *inet_ntop(int af, const void *addrptr,
  4. char *strptr, socklen_t len);

参数

void *ddrptr,即地址结构(in_addr或in6_addr)
和前面讨论的三个函数相比,这两个函数的参数中的地址均是指针(inet_aton参数中地址的是指针,但inet_ntoa参数中的地址是结构本身)

char *strptr,就是要传入或返回的表达格式。它不可以是一个空指针。

len实际是size_t类型,它的值可以使用以下两个宏:

  1. #define INET_ADDRSTRLEN 16 /* IPv4 */
  2. #define INET6_ADDRSTRLEN 46 /* IPv6 */