目录
6、"将sin_addr设置为INADDR_ANY"的含义是什么?
本部分主要整理 “ Web 服务器 ” 项目整体流程以及其中遇到的一些典型问题。
1、Proactor 模式
本服务器程序处理 I/O 事件采用 Proactor 模式,Proactor 模式将所有 I/O 操作都交给主线程和内核来处理(进行读、写),工作线程仅仅负责业务逻辑。使用同步 I/O 方式模拟出 Proactor 模式。原理是:主线程执行数据读写操作,读写完成之后,主线程向工作线程通知这一 ” 完成事件“。那么从工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。
使用同步 I/O 模型(以 epoll_wait为例)模拟出的 Proactor 模式的工作流程如下:
1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。
2. 主线程调用 epoll_wait 等待 socket 上有数据可读。
3. 当 socket 上有数据可读时,epoll_wait 通知主线程。主线程从 socket 循环读取数据,直到没有更多数据可读,然后将读取到的数据封装成一个请求对象并插入请求队列。
4. 睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往 epoll 内核事件表中注册 socket 上的写就绪事件。
5. 主线程调用 epoll_wait 等待 socket 可写。
6. 当 socket 可写时,epoll_wait 通知主线程。主线程往 socket 上写入服务器处理客户请求的结果。
同步 I/O 模拟 Proactor 模式的工作流程:
2、main.cpp 工作流程
main.cpp 中的线程为主线程,线程池中的线程为工作线程。当主线程监听到有客户端时,交给 conn 来完成读/写。工作线程仅仅负责业务逻辑。
- users.init( ) 函数主要是将得到的新客户端的文件描述符添加到 epoll 实例 m_epollfd 中
- 关闭连接,主要就是将对应的 sockfd 从 m_epollfd 中删除
3、IP 地址与端口号
在 TCP/IP 协议族中,IP 地址是唯一表示一台计算机的标识号。计算机的 IP 地址如同人的身份证一样,都是独一无二的。IP 地址是 32 位的二进制数,通常被分割为 4 个 “ 8位二进制数 ” ,即点分十进制表示(如:10.20.22.196)。
要使网络中的计算机进行通信,通过 IP 地址可以连接到指定计算机,但如果想访问目标计算机中的某个应用程序,还需要指定端口号。