C/S模型
TCP通信C/S模型图如下所示:
TCP服务端通信的常规步骤:
- 使用 socket() 创建 TCP 套接字(socket)
- 将创建的套接字绑定到一个本地地址和端口上(Bind)
- 将套接字设为监听模式,准备接收客户端请求(listen)
- 等待客户请求到来: 当请求到来后,接受连接请求,返回一个对应于此次连接的新的套接字(accept)
- 用 accept 返回的套接字和客户端进行通信(使用 write() / send() 或 send() / recv() )返回,等待另一个客户请求关闭套接字
TCP客户端通信的常规步骤:
- 创建套接字(socket)
- 使用 connect() 建立到达服务器的连接(connect)
- 客户端进行通信(使用 write() / send() 或 send() / recv() )
- 使用 close() 关闭客户连接
epoll函数介绍:
int epoll_create(int size) //创建一个epoll句柄,参数size用来告诉内核监听的数目,size为epoll所支持的最大句柄数 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) //函数功能: epoll事件注册函数 //参数epfd为epoll的句柄,即epoll_create返回值 //参数op表示动作,用3个宏来表示: EPOLL_CTL_ADD//(注册新的fd到epfd), EPOLL_CTL_MOD//(修改已经注册的fd的监听事件), EPOLL_CTL_DEL//(从epfd删除一个fd);
//其中参数fd为需要监听的标示符; //参数event告诉内核需要监听的事件,event的结构如下: struct epoll_event { __uint32_t events; //Epoll events epoll_data_t data; //User data variable };
服务端调用epoll步骤如下:
- 调用 epoll_create 函数在 Linux 内核中创建一个事件表;
- 然后将文件描述符(监听套接字 listener )添加到所创建的事件表中;
- 在主循环中,调用 epoll_wait 等待返回就绪的文件描述符集合;
- 分别处理就绪的事件集合,本项目中一共有两类事件:新用户连接事件和用户发来消息事件。