TCP服务器通信流程

1.服务器通信模型

TCP服务器通信流程_第1张图片
tcp服务器
接电话模型:创建套接字(服务器电话),绑定ip和端口在套接字上(绑定固定电话号码),监听有没有新在连接(监听),接受连接(接听电话),收发数据(读写对socket文件操作)(说话交流),关闭(挂电话)

说明:一台主机可能多个ip所以得绑定

说明:客户端不用绑定,系统随机分配一个端口给他

详细具体过程

TCP服务器通信流程_第2张图片
TCP服务器通信流程_第3张图片

说明:
listen监听创建一个已完成队列和未完成队列,未完成队列经过三次握手到达已完成队列中,将服务器变成被动接收模式
accept从已完成队列中提取连接,得到一个新的已连接套接字,用这个已连接套接字和客户端通信,原来那个套接字只用来处理新的请求和接收新的连接,不用原来的那个通信了。

已连接套接字端口和ip和原来的监听套接字ip和端口一模一样同等复制
要服务很多客户端,不止一个
TCP服务器通信流程_第4张图片
作用:专门分工,提高工作效率,避免一个套接字产生错乱

函数说明:

bind函数
功能:绑定ip和端口在服务器套接字上
#include /* See NOTES */
#include
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:
socket文件描述符,对应目标套接字
addr:
构造出IP地址加端口号,获取服务器ipv4套接字结构体地址
addrlen:
sizeof(addr)长度,ipv4结构体的大小
返回值:
成功返回0,失败返回-1, 设置errno

listen函数
功能:监听是否有连接
#include /* See NOTES */
#include
int listen(int sockfd, int backlog);
sockfd:
socket文件描述符,socket套接字
backlog:TCP服务器通信流程_第5张图片
排队建立3次握手队列和刚刚建立3次握手队列的链接数和
已完成连接数和未完成连接数之和的最大值(一般填128够用了)

说明:
查看系统默认backlog
cat /proc/sys/net/ipv4/tcp_max_syn_backlog

返回值
listen()成功返回0,失败返回-1。

accept函数
功能:从已完成连接队列提取新的连接
#include /* See NOTES */
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockdf:
socket文件描述符,套接字
addr:
传出参数,返回链接客户端地址信息,含IP地址和端口号
获取到客户端ipv4套接字结构体地址
addrlen:
套接字结构体大小的地址
传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小
返回值:
成功返回一个新的socket文件描述符,理解成创建一个新的套接字,用于和客户端通信不用那个旧的套接字
失败返回-1,设置errno

说明:如果没有新的连接,accept会阻塞

程序框架

TCP服务器通信流程_第6张图片

一一对应TCP服务器通信流程_第7张图片

你可能感兴趣的:(Linux网络编程,服务器,tcp/ip,网络,网络编程)