当前位置: 首页 > news >正文

一个没正常处理tcp对端关闭的bug

最近使用自研的http client时发现一个问题,对端在发送响应数据之后立即调用close关闭了连接,我这没有调用到响应的回调,而是调用到了连接关闭的回调。对端延迟一会再关闭连接就没问题,用curl去访问也是正常的。经过排查是没有正确处理对端关闭导致的。

根据gnu文档以及其他搜索结果,如果没通过SO_LINGER选项改变close的默认行为,调用close关闭socket时,会关闭两个方向的数据流。读方向上,内核会将套接字设置为不可读,任何读操作都会返回异常;写方向上,内核会尝试将发送缓冲区的数据发送,之后发送FIN包结束连接,这个过程中,往套接字写入数据都会返回异常;若对端还发送数据过来,会返回一个RST报文。

epoll触发EPOLLIN事件时,表示对应的连接上有数据可以读出。tcp连接的远端主动关闭连接,也相当于可读事件,因为需要处理发送来的FIN包。

有问题的接收代码如下,问题在于recv返回0时,没有处理已经收到的数据就直接关闭socket。

int tcp_event::handle_read()
{octets& read_buf = _ses->get_read_buf();int ret_bytes = 0;while(true){if(read_buf.full()){_ses->onrecv();}int bytes_cnt = recv(_fd, read_buf.end(), read_buf.free_space(), 0);if(bytes_cnt == 0){_ses->close(CLOSE_REASON_ONRECV);return -1;}else if(bytes_cnt != -1){ret_bytes += bytes_cnt;read_buf.resize(read_buf.size() + bytes_cnt);}else{if(errno == EAGAIN || errno == EWOULDBLOCK) break;if(errno == EINTR) continue;_ses->close(CLOSE_REASON_ONRESET);return -1;}}_ses->onrecv();return ret_bytes;
}
http://www.lryc.cn/news/249902.html

相关文章:

  • 什么是JDK
  • 积分表二(高等数学同济版中所有的积分公式)
  • Golang数据类型(数字型)
  • 【JVM系列】- 穿插·对象的实例化与直接内存
  • 【C++干货铺】继承 | 多继承 | 虚继承
  • 【ARM CoreLink 系列 8.1 -- SMMU 详细介绍-STE Entry 详细介绍 1】
  • 高防CDN与WAF防火墙的协同防护:构筑网络安全堡垒
  • golang strings包的基本操作
  • 高效解决在本地打开可视化服务器端的tensorboard
  • Spring Boot Actuator 2.2.5 基本使用
  • 字符串相似度匹配算法_莱茵斯坦距离算法
  • 【EI会议征稿】第九届电气、电子和计算机工程研究国际学术研讨会 (ISAEECE 2024)
  • Maven Helper插件——实现一键Maven依赖冲突问题
  • 理解位运算的规则
  • Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊
  • Vue H5页面长按保存为图片
  • 【Web】UUCTF 2022 新生赛 个人复现
  • 设置python下载包代理
  • nginx 配置前端项目添加https
  • 人群计数CSRNet的pytorch实现
  • 【HTTP协议】简述HTTP协议的概念和特点
  • 经典神经网络——AlexNet模型论文详解及代码复现
  • flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级
  • 【Flutter】graphic图表实现自定义tooltip
  • 手机上的记事本怎么打开?安卓手机通用的记事本APP
  • 一起学docker系列之十五深入了解 Docker Network:构建容器间通信的桥梁
  • 前端OFD文件预览(vue案例cafe-ofd)
  • Java[list/set]通用遍历方法之Iterator
  • ubuntu/vscode下的c/c++开发之-CMake语法与练习
  • Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)