网络字节序和主机字节序转换的函数
1 | #include <arpa/inet.h> |
IP地址转换函数
1 | #include <arpa/inet.h> |
inet_addr和inet_ntoa
这两个函数只在IPv4中使用
1 | in_addr_t inet_addr(const char *cp); |
in_addr_t 即long型,参数cp表示一个点分十进制字符串,返回值是十进制长整型数。
1 | char *inet_ntoa(struct in_addr in); |
参数in是一个in_addr类型的结构体,这个结构体原型为:
1 | struct sockaddr_in { |
ine_ntoa返回的是点分十进制的IP地址字符串。另外需要注意的是:inet_ntoa返回一个char指针,而这个char指针 的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。
inet_pton和inet_ntop
这两个函数可以在IPv4和IPv6中使用。
1 | int inet_pton(int af, const char *src, void *dst); |
inet_pton 是 inet_addr 的扩展,支持的多地址族如下:
af = AF_INET
src为存放了IPv4格式的地址的字符串,函数将该字符串转换为in_addr的结构体,并复制在dst中。
af = AF_INET6
src为存放了IPv6格式的地址的字符串址,函数将该地址转换为in6_addr的结构体,并复制在dst中。
返回值
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。
1 | const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); |
这个函数是将一个网络二进制结构转换为点分十进制,并且保存在字符串dst中,cnt表示dst的长度。如果dst太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC。