include <arpa/inet.h>
考虑到不同语言不同库函数的参数可能不同,我这里以c语言的arpa/inet.h库中的函数为例.
网络字节序是什么
网络字节序(Network Byte Order)是指在网络通信中用于数据交换时所采用的字节序,它是大端字节序(Big-Endian)。网络字节序确保了在不同计算机架构之间传输数据时的一致性,特别是涉及到多字节数据类型(如整数、浮点数等)的传输。
网络字节序转换
在socket通信过程中,数据不断的从网络到主机,从主机到网络,这其中涉及大量的数据转换问题,同时也产生了大量的转换函数,用于网络字节序与主机字节序的转换,这其中纷繁复杂,我也是一知半解,仅以此记录。
htons(),htonl()
Host to Network Short,Host to Network long,主要就是用于将本地ip地址转换为网络字节序
Host to Network Short一般是用于端口号的转换,short占两个字节端口号也是占两个字节
htons()的参数与返回值都是16位的无符号整型
Host to Network long一般是用于网络号的转换,将32位的ip地址进行转换
htonl()的参数与返回值都是32位的无符号整型,而ip地址是字符数组或者说是字符串类型,在转换时不能直接使用htonl()这个函数,而是需要将其先从char[]类型转为int型
atoi()
这个函数可以将string类型转换为int型的数据,但是这样两步走的方法在我们看来挺麻烦,所以有inet_ntop()函数和inet_pton()函数,待会介绍.
ntohl()和ntohs()
Network to Host Long,Network to Host Short,主要就是用于将网络字节序ip地址转换为本地字节序
上面四个函数的参数都要求是整型,而ip地址都是在主机中是以字符串的形式存在(“127.0.0.1”),所以我们要想使用还得将其转为int才能再转为,那样自然就很麻烦。
inet_pton()和inet_ntop()
inet_pton
inet_pton 是一个网络编程中使用的函数,它用于将一个点分十进制格式的IP地址转换为网络字节顺序的二进制格式。
int inet_pton(int af, const char *src, void *dst);
第一个参数AF是传输协议 常见有两种AF_INET和IAF_INET6.
第二个参数是IP地址,作为传入参数数
第三个参数是输出参数网络字节顺序的二进制格式
成功返回 1
异常返回0 : 有可能是传入一个无效的ip地址
失败返回-1
inet_ntop()
inet_pton 是一个网络编程中使用的函数,它用于将一个网络字节顺序的二进制格式转换为点分十进制格式的IP地址。
const char *inet_ntop(int af, const void *src,
char *dst, socklen_t size);
值得一提的是inet_ntop()的第四个参数表示的是dst缓冲区的大小。而inet_pton不需要第四个参数的原因在于inet_pton()函数的作用仅仅是将主机字节序的IP地址转换为网络字节序的IP地址,但不会去使用这个ip地址,但inet_ntop()函数的返回值是有可能要用到的。
inet_addr(const char *_cp)
inet_pton()和inet_ntop()函数都是既可以适配ipv4又可以适配ipv6的,而inet_addr()函数可以将字符串类型的ip地址转换为32int类型的数据,却仅仅适配ipv4.
//在这种情况下,两种方法都可以
connect_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//inet_pton(AF_INET,"127.0.0.1",&connect_addr.sin_addr.s_addr);
connect_addr.sin_family = AF_INET;
connect_addr.sin_port = htons(PORT);
connect(client_fd, (struct sockaddr *)&connect_addr, sizeof(connect_addr)
#注:事实上,像这种函数还有很多,我也看到很多不同的函数却都能实现目标,也是很头大了,但是就目前来看,inet_pton()和inet_ntop()基本是万能的.