网络字节序与主机字节序转换函数和IP地址转换函数

网络字节序和主机字节序转换的函数

1
2
3
4
5
#include <arpa/inet.h>  
uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序(IP地址转换)
uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序(端口号转换)
uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序(IP地址转换)
uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序(端口号转换)

IP地址转换函数

1
2
3
4
5
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp); /* “点分十进制” -> “整数”, */
char *inet_ntoa(struct in_addr in); /* “整数” -> “点分十进制”, */
int inet_pton(int af, const char *src, void *dst); /* “点分十进制”-> “整数”, */
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);/* “整数”->“点分十进制”*/

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
2
3
struct sockaddr_in {
uint32_t s_addr;
};

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。