当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:基于TCP协议的网络通信(线程池

    Scissors_初夏的博客:初夏小谈:基于TCP协议的网络通信(线程池

    作者:[db:作者] 时间:2021-08-16 12:57

    一、TCP通信网络中可能用到的接口:

    1.创建套接字

    int socket(int domain, int type, int protocol);

    2.绑定地址信息和端口

    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

    3.开始监听:告诉操作系统可以开始与用户进行三次握手连接;每一个客户端到来都会为它创建一个新的socket与它单独通信,为了防止而已连接攻击服务器设置backlog来限制最大并发连接数。在内核中已经创建连接队列和未完成的对列,通过最大节点数量来限制。

    int listen(int sockfd, int backlog);

    4.获取上一步已完成连接的客户端新建socket。

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    sockfd:监听socket。仅用于接收第一次请求。在后续通信中它不再使用。与客户端进行通信。

    5.收发数据

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);

    recv返回值为0,不是没有数据,而是断开连接。

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);

    6.客户端连接请求:

    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

    TCP通信具体流程:

    (1)服务端通信步骤:创建套接字---》绑定地址信息---》开始监听---》获取已完成连接的客户端新建socket---》收发数据---》关闭套接字。

    (2)客户端通信步骤:创建套接字---》不推荐手动绑定地址信息---》向服务器发起连接请求---》收发数据---》关闭套接字。

    二、TCP协议通信注意事项:

    由于基本的TCP服务端程序同时只能与一个客户端进行通信:因为服务器并不知道客户端数据什么时候到来,因此服务端程序流程只能写死,而写死可能会导致阻塞

    阻塞分为两点:

    1.阻塞到accept的情况:当服务器一接收连接一个客户端,并与之通信,通信完成后,返回上来重新获取新的新建socket,而可能没有接收到,默认接收类型是阻塞,所以会卡在这块。?

    2.阻塞到recv的情况:当服务器先接收连接到一个客户端,但客户端并未与之通信,便卡在接收的地方,此时又来了一个客户端,服务器无法与之连接,第二个客户端给服务器发送数据,便无法获取,因为它卡在第一个客户端的recv处。

    所以就使用多进程/多线程来处理。

    在多进程tcp服务端程序:一个子进程处理一个客户端,实现多个客户端同时处理。父进程必须关闭socket,处理僵尸子进程问题。设置信号。

    在多线程tcp服务端程序:一个子线程处理一个客户端,实现多个客户端的同时处理。主线程不能退出即不能关闭socket:线程间共享代码段,数据段。同一线程共享文件描述符表。

    三、代码实现:

    1.实现TCP通信所需的所有函数的接口类:

    2.实现线程池版本的服务端:

    3.客户端程序:

    4.运行结果:

    4.1服务端显示:

    4.2客户端jack:

    4.3客户端小明:

    4.4客户端peter:

    四.tcp面向连接特性:

    1.TCP有自己的保活探测机制,在操作系统中会进行保活探测。当Linux下双方在7200s内无交互时,就会开始服务端就发保活探测包,每隔75s发一次,共发9次。若都没有回复,则认为连接断开。sysctl -a | grep keep

    2.在代码中,若连接断开/对端关闭连接,则recv返回0;send会触发异常—SIGPIPE进程退出。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ?珍&源码

    cs