网络编程需要关注的问题
- 连接建立(接受客户端的连接,服务器去连接第三方服务mysql redis)
- 连接断开
- 消息到达(从readbuffer中取数据)
- 消息发送完毕(将数据发到writebuffer中)
连接建立
来自客户端的连接产生的fd,设置为读事件进行监测。
连接上游服务时,采用一个非阻塞的I/O,第一次调用connect时返回值为-1,错误号是EINPROGRESS,说明当前连接正在继续。然后将事件注册为写事件,添加到epoll中进行管理。(服务器与上游服务建立连接三次握手的过程,第二步上游服务返回ack包,本地服务器收到以后会触发epollout事件)
epollout被触发,连接建立成功,可以在回调函数中进行一些对上游服务的初始化操作
连接断开
客户端主动断开连接时,客户端主动关闭写端发送fin包,服务器收到fin后关闭读端,read返回0得知客户端已关闭,注册EPOLLRDHUP事件。
服务端收到fin包有两种情况,一种是read返回0 另一种是服务端的读端关闭触发epollrdhup事件
四次挥手第三步服务器端将写通道关闭发送fin包,客户端接收到以后,把读端关闭,发送ack包,此时会触发EPOLLRDHUP事件,同时等待2msl事件,进入closed状态。
支持半关闭就先关闭服务端的读,服务端继续发送业务代码,发送完成后再发fin给客户端