目录
3.常见的“点分十进制” 到 ” uint32_t 的转化接口
3.1. inet_aton 和 inet_ntoa (ipv4)
3.2. inet_pton 和 inet_ntop (ipv4 和 ipv6)
3.4. inet_addr 和 inet_network 和 inet_aton 区别
1.struct sockaddr_in的结构
2.一般我们写的结构
一般我们在程序中用的点分十进制来表示 IP 是一个字符串。
最后在网络发送的时候都需要填入到 sockaddr_in 结构体中。
3.常见的“点分十进制” 到 ” uint32_t 的转化接口
3.1. inet_aton 和 inet_ntoa (ipv4)
函数原型:
#include<sys/scoket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
//说明
用来将参数cp所指的ipv4点分十进制网络地址字符串转换成网络使用的大端字节序二进制数字,
然后存于参数inp所指的in_addr结构中。
成功则返回非0值,失败则返回0。
//struct in_addr定义为:
struct in_addr
{
unsigned long int s_addr;//32位的unsigned int 类型
};
char *inet_ntoa(struct in_addr in);
//说明
用来将参数in所指的大端网络字节序二进制的数字转换成ipv4点分十进制字符串网络地址
然后将指向此网络地址字符串的指针返回。
成功则返回字符串指针,失败则返回NULL。
3.2. inet_pton 和 inet_ntop (ipv4 和 ipv6)
#include <sys/socket.h>
#include <netinet/in.h>
#include<arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
//说明
用来将ipv4或者ipv6类型的ip地址(点分十进制)字符串转换为大端网络字节序二进制数字,
第一个参数af是地址簇,取值为AF_INET(表示ipv4使用的地址簇)和AF_INET6(表示ipv6使用的地址簇),
第二个参数src是来源地址,(ip点分十进制字符串)
第三个参数 dst接收转换后的数据。(大端网络字节序二进制数字)
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
说明:
将大端网络字节序二进制数转换为ipv4或者ipv6类型的字符串,
第一个参数af是地址簇,取值为AF_INET(表示ipv4使用的地址簇)和AF_INET6(表示ipv6使用的地址簇)
第二个参数src为32位的IP地址。(大端网络字节序二进制数字)
第三个参数dst指向存放转化字符串的缓冲区。
第四个参数cnt他是所指向缓存区dst的大小
3.3. inet_addr 和 inet_network
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
这个接口很简单就是把 点分IP 转化为 网络IP 以返回值的形式返回。
但是
inet_addr 返回的网络IP 是网络字节序(大端)
inet_network返回的网络IP 是主机字节序(未知大小端)
3.4. inet_addr 和 inet_network 和 inet_aton 区别
三者的作用:
都是将点分IP转换为二进制IP。
三者原型:
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
头文件:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
区别:
inet_aton计算出来的是网络字节序的二进制IP
inet_network计算出来的是主机字节序的二进制IP
inet_addr计算出来的是网络字节序的二进制IP
那inet_aton和inet_addr有什么区别呢?
inet_addr不支持255.255.255.255,inet_aton支持255.255.255.255