scoket通信 -- 网络字节序

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()基本是万能的.

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值