标签:html 无符号 href 不同 htm 32位 network 传输 define
ping命令使用到了网络中的ICMP协议:
关于ICMP介绍看这里:https://www.cnblogs.com/wanghao-boke/p/11670473.html
网络地址信息
地址信息表示:
网络传输时地址信息包括:
使用相关结构体来纪录地址信息:
struct sockaddr_in{ sa_family_t sin_family; // 地址族 uint16_t sin_port; // 端口号 struct in_addr sin_addr; // 32位IP地址 char sin_zero[8]; // 不使用 }; struct in_addr{ in_addr_t s_addr; // 32位IP地址 }; struct in_addr{ in_addr_t s_addr; // 32位IP地址 }; #define in_addr_t uint32_t //无符号整型32位
还可以使用以下结构体:
struct sockaddr{ sa_family_t sin_family; // 地址族 char sa_data[14]; // IP地址和端口 };
成员sa_data保存的信息包含IP地址和端口号,剩余部分填充0。
在使用时定义信息地址时使用struct sockaddr_in结构体,然后将该结构体类型转成struct sockaddr结构体传递给网络编程。
主机字节序与网络字节序
在CPU中,4字节整型数值1在内存空间保存方式是不同的。
4字节整型数值1可用二进制表示如下:
00000000 00000000 00000000 00000001
而在有些CPU则以倒序保存
00000001 00000000 00000000 00000000
这两种CPU解析数据的方式分别被称为
大端序:高位字节存放到低位地址。
小端序:高位字节存放到高位地址
为了使发送和接受双方主机的CPU在解析数据方式上保持一致,在网络传输数据时约定统一为大端序,这种约定被称之为网络字节序。
所以在网路传输数据前,需要把数据数组转换成大端序格式再进行网络传输,接收到网络数据后,需要转换本机字节格式然后进行后续处理。该步骤都会有关函数来处理。
我们需要做的就是向struct sockaddr_in结构体变量种填充IP地址和端口数据的时候转换该格。
具体转换字节序的函数有以下几种方式:
unsigned short htons(unsigned short); unsigned short ntohs(unsigned short); unsigned long htonl(unsigned long); unsigned long ntohl(unsigned long);
htonl/htons中h表示(host)主机字节序,n表示(network)网络字节序,s表示short,l指的是long(linux中long类型和int一样只占4字节)。
实例:
/*test.c*/ #include<stdio.h> #include<arpa/inet.h> int main() { unsigned short hosts = 0x1234; unsigned short nets; unsigned hostl = 0x12345678; unsigned netl; nets = htons(hosts); netl = htonl(hostl); printf("Host order short: %#x \n", hosts); printf("NetWork order short: %#x \n", nets); printf("Host order long: %#x \n", hostl); printf("NetWork order long: %#x \n", netl); return 0; }
运行结果:
Host order short: 0x1234
NetWork order short: 0x3412
Host order long: 0x12345678
NetWork order long: 0x78563412
扩展:
Intel系统的CPU采用的都是小端序标准。
标签:html 无符号 href 不同 htm 32位 network 传输 define
原文地址:https://www.cnblogs.com/wanghao-boke/p/12180697.html