epoll编程细节

本文详细探讨了TCP网络编程中的关键环节,包括连接建立(服务器与客户端及第三方服务的三次握手)、连接断开(四次挥手与半关闭状态)、消息到达与发送的处理,以及TCP的Keepalive机制和心跳检测在确保连接稳定性和检测对端状态中的作用。同时,文章提到了不同场景下对半关闭状态的支持以及如何处理各种异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络编程需要关注的问题

  • 连接建立(接受客户端的连接,服务器去连接第三方服务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给客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值