一、inet_aton、inet_addr、inet_ntoa
  • 这三个函数只适用于IPv4地址

 点分十进制IP字符串-->网络字节序的二进制IP

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);
  • 功能:将参数1的点分十进制IP字符串转为32位的网络字节序的二进制IP,并保存到参数2中
  • 参数:1.点分十进制的字符串  2.网络字节序的IP结构体地址
  • 返回值:成功返回1。否则返回0
  • 备注:该函数有一个特殊情况,如果inp指针为空,那么该函数仍然对输入的字符串执行有效性检查,但是不存储任何结果
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);
  • 功能:将参数的二进制字符串转为32位的网络字节的二进制IP,并通过返回值返回
  • 参数:十进制的字符串
  • 返回值:成功返回32位二进制网络字节序的IPv4地址。否则返回INADDR_NONE(32位全为1)
  • 存在的一个问题:从0.0.0.0到255.255.255.255之间的IP都是有效的IP地址,但是该函数返回INADDR_NONE常值(32位均为1)。这就意味着255.255.255.255这个IP不能作为参数传递给该函数,因为它的二进制网络字节序值被用来指示inet_addr函数失败
  • 存在的另一个问题:一些帮助手册声明该函数出错时返回-1而不是INADDR_NONE,这样的话一个无符号的值(INADDR_NONE)和一个负常值(-1)进行比较时可能会发生问题,具体取决于C编译器
  • 因为该函数存在以上几个问题,所以已被废弃了,新的代码应该改用inet_aton函数,或者最好选择下面介绍的新函数(既适用于IPv4的也适用于IPv6的)

网络字节序的二进制IP-->点分十进制IP字符串 

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

char *inet_ntoa(struct in_addr in);
  • 功能:将网络字节序的二进制IP转换为点分十进制的IP字符串,并通过返回值返回
  • 参数:网络字节序的二进制IP
  • 返回值:成功点分十进制的IP字符串
  • 注意事项:inet_ntoa函数将一个32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。 由该函数的返回值所指向的字符串驻留在静态内存中。这意味着该函数是不可重入的,这个概 念我们将在后面讨论。最后需要留意,该函数以一个结构而不是以指向该结构的一个指针作为其参数
二、inet_pton、inet_ntop
  • 这二个函数即适用于IPv4地址,又适用于IPv6地址
  • 这两个函数的family参数为AF_INET或AF_INET6。如果以不被支持的地址族作为family参数,这两个函数就都返回一个错误,并将errno设置为EAFNOSUPPORT

点分十进制IP字符串-->网络字节序的二进制IP 

#include <arpa/inet.h>

int inet_pton(int family, const char *src, void *dst);
  • 参数:1.AF_INET或AF_INET6  2.点分十进制IP地址字符串  3.存放转换的网络字节序的二进制IP指针
  • 返回值:成功返回1;输入的格式错误返回0;出错返回-1

网络字节序的二进制IP-->点分十进制IP字符串 

#include <arpa/inet.h>

const char *inet_ntop(int family, const void *src,char *dst, socklen_t size);
  • 参数:1.AF_INET或AF_INET6  2. 网络字节序的二进制IP指针  3.用来保存转换的点分十进制IP地址字符串  4.目标存储单元大小,避免函数溢出调用者的缓冲区
  • size参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。为有助于指定这个大小,在<netinet/in.h>头文件中有如下定义:
#define    INET_ADDRSTRLEN    16   /*for IPv4 dotted-decimal*/
#define    INET6_ADDRSTRLEN   46   /*for IPv6 hex string*/
  • dst参数不可以是一个空指针,调用者必须为目标存储单元分配内存并制定其大小
  • 返回值:成功返回点分十进制字符串(就是参数3)。出错返回NULL
三、总结:

UNP编程:03---本地IP与网络IP转换(inet_aton、inet_addr、inet_ntoa、inet_pton、inet_ntop)_网络IP