网络编程:就是两个不在同一台主机的进程进行通信。
网络基础:
协议:分布不同主机之间共同遵守的,基于网络,约定ip和port,约定对话格式
如何通过网络进行通信:分层
OSI七层结构:物链网输会示用
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP/IP四层结构:
网络接口层(相当于物理层加数据链路层),网络层,传输层,应用层。
ip:ipv4是32位的,ipv6是128位的
ip地址的表示是点分十进制的方式,就是每一个字节用来分割,转换成十进制来表示,
点分十进制的地址转换成整形:inet_aton();整型转化成点分十进制:inet_ntoa();
ipv4地址划分:
A:一个字节的网络号+三个字节的主机号,要求以0开头,范围0 - 127;
B:两个字节的网络号+两个字节的主机号,要求以10开头,范围128 - 191
C:三个字节的网络号+一个字节的主机号,要求以110开头,范围192 - 223
D:组播地址,要求1110开头,224 - 239
E:科学研究
ipv4的特殊地址:127.0.0.1环回测试地址,测试本机的TCP/IP协议栈是否是通的。
255.255.255.255是广播地址
0.0.0.0是本地任意地址
port端口:用来区分服务,0 - 65535
0 - 1024是专用端口,周知端口
1025 - 65535是用户端口
跨主机传输数据类型:
不能传递指针,
大小端未必一致:
通常pc机都是小端存储的,嵌入式设备大端居多
网络编程中如果要发送的数据是大于1字节的,需要将数据转化成网络字节序再发送,在接受的时候转换成本地字节序。
网络字节序通常是大端的。
本地字节序转换成网络字节序:htons和htonl
网络字节序转换成本地字节序:ntohs和ntohl
数据类型要明确:
uint8_t,uint16_t,u32
结构体对齐因编译版本而异:
单字节对齐:struct {}__attrbute__((packed))
网络编程:
linux秉承着降低网络编程的难度,一切皆文件,将网络编程抽象了成一个文件叫socket。