1.网络字节序
大端字节序:高地址存放低字节,低地址存放高字节
小端字节序:高地址存放高字节,低地址存放低字节
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址存放高字节
网络数据流在发送时都是从低地址开始发送,也就是先发的是低地址,后发的是高地址。
如上图所示,假如数据0x01234567 在某客户端需要发送到某服务器
则在低地址存放的就是 01 高地址存放的就是67 也就是先发0x01 后发0x67 但是如果发送端 或者接受端为小端字节序 那么这组数据就会被解释为0x67...01 因此若主机是小端字节序需要做相应的转换才能保持 数据一致
为了使网络程序具有可移植性 使用同样的C代码在大端和小端主机都能运行 可以调用以下库函数进行转换
#include<arpa/inet.h>
htonl(); 主机转网络 l 表示32位长整数
htons(); 主机转网络 s 表示16位短整数
注:以上两个函数一般是在在编写socket网络通信时 一般是将本地的I端口(整型) 装换为计算机可识别的网络字节序
ntohl(); 网络转主机 l 表示32位长整数
ntohs(); 网络转主机 s 表示16位短整数
注:以上两个函数一般是在在编写socket网络通信时 一般是将将计算机中的网络字节序转换为我们可识别端口(整型)
IP地址的转换,需要调用如下库函数:
IP(字符串型的)---->网络字节序
int inet_pton(int family, const char *strptr, void *addrptr); //将点分十进制的ip地址转化为用于网络传输的数值格式返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
网络字节序---->IP(字符串型的)
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len); //将数值格式转化为点分十进制的ip地址格式返回值:若成功则为指向结构的指针,若出错则为NULL
以上函数应用实例可翻看博主之前的文章附链接https://blog.csdn.net/zhouzb96/article/details/121939891?spm=1001.2014.3001.5501