linux C/C++套接字通信 TCP粘包
socket编程概述
- windows和linux平台的套接字函数几乎一样,但是windows中使用socket通信之前需要先加载套接字库,最后在释放这些套接字资源,linux中就不需要夹在和释放了
- 基于客户端和服务器实现一个并发的通信模型,网络通信中客户端与服务器的比例是n比1,由于客户端过多,就需要客户端多线程并发处理请求,多线程可以换成线程池
6 字节序
- 小端是主机字节序,数据的
低位字节
放在低位地址
,高位字节
放在高位地址
,不符合人类认知。 - 大端是网络字节序,数据的
低位字节
放在高位地址
,高位字节
放在低位地址
- 套接字通信过程中操作的数据都是大端存储的,包括:接收/发送的数据、IP地址、端口。
9
10 socket 和 bind 函数
本机套接字通信指定int socket(int domain, int type, int protocol)
中的参数domain
为AF_UNIX/AF_LOCAL
,
11 listen
int listen(int sockfd, int backlog)
的backlog
参数在内核中指定的是128,backlog
指的是服务器一次性可以处理多少个客户端请求,而不是说服务器最多可以建立的连接请求
12 和客户端建立连接的accept函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
中sockfd是第服务端用来监听的fd,而其返回值是用来通信的fd,accept会在没有客户端发起请求连接的时候阻塞,accept一般放在一个循环中,每循环一次就可以和对应的客户端建立连接
13 connect
connect会自动分配端口去绑定fd,因为服务器不会去主动连接客户端
16 fd在套接字通信中的作用
服务端存在多个用于通信的fd,而用于监听的fd只有一个。在进行socket通信的时候,每一个fd对应与内核中的两块内存Read Buffer与Write Buffer

24 线程池实现并发服务器
TCP 粘包
解决方法:
- 基于标准的应用层协议(http, https)来封装不定长的数据包
- 在每个数据包的尾部添加特俗字符,接收端如果遇到特殊字符,代表数据接收完毕。但是效率低,因为需要在每接收一个字符就对其做判断,效率低
- 在数据包的前面添加包头,数据由两部分组成:数据头 + 数据块。
- 数据头:存储当前数据包的总字节数,接收端先接收数据头,然后再根据接收头接收对应大小的字节
- 数据块:存储实际内容