TCP传输过程中,客户端异常退出导致服务端send函数崩溃

2023-05-16

在linux下编写TCP socket程序时,如果客户端突然退出,导致连接中断,这个时候服务端如果继续调用send函数发送数据的话,会导致整个进程退出,这是我们不愿看到的。(注:如果是服务端突然退出,客户端继续调用send发送,是不会导致进程退出的)。

为什么会退出进程而不是返回一个错误值呢?感觉有点“霸道”,连留给我们处理问题的机会都没有。

原来,当服务端尝试使用一个disconnected socket进行send数据时,会让低层抛出一个SIGPIPE信号,这个信号的缺省处理方法是退出进程!

知道了问题原因后,处理就容易多了,比较简单的方法有以下2种:

重新定义一个信号处理函数,覆盖系统默认处理方法

void signal_process(){ //process code}signa(SIGPIPE, signa_process);

这样,进程就不会退出了。

修改send函数最后一个参数

linux下send函数原型为:

ssize_t send(int fd, const void*buf, size_t n, int flags);

其中,flags被忽略了,一般设置为0,但当flags为0时,如果客户端断开,服务端继续send时,会引发一个信号SIGPIPE,此信号会引发进程退出。

所以只需要把flags设置为MSG_NOSIGNAL,则不会导致信号退出。MSG_NOSIGNAL的含义是,当对方断开连接导致错误时,不发送SIGPIPE信号,但还是会返回EPIPE错误

这样,进程不退出,我们只需要判断send的返回值是否小于或等于0,就知道send函数是否调用成功!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP传输过程中,客户端异常退出导致服务端send函数崩溃 的相关文章

随机推荐

  • docker内使用gpu

    创建容器 docker run it d name xiaxinkaigpu v datadrive xxk github github gpus all nvidia cuda 10 0 devel ubuntu16 04 进入容器 do
  • 编译protobuf v3.20.0

    https github com protocolbuffers protobuf git clone git 64 github com protocolbuffers protobuf git cd protobuf git check
  • Ubuntu18.04安装配置Samba

    1 安装samba sudo apt install samba 2 添加用户 xiaxinkai 64 aliyun etc samba sudo smbpasswd a xiaxinkai New SMB password Retype
  • 【开发工具】适用于Windows的Linux子系统一一WSL安装使用教程

    文章目录 一 简介二 准备工作二 安装WSL2 1 启用适用于 Linux 的 Windows 子系统2 2 启用虚拟机功能2 3 安装所选的 Linux 分发 一 简介 Windows Subsystem for Linux xff08
  • github如何删除commit记录

    git reset hard acb28f2114413378d48ae3b257dca62a1cd29d0f 想要恢复到的版本commit id git push origin HEAD force
  • Windows7 PowerShell 2.0升级到 PowerShell 5.1

    Windows7 sp1内置的PowerShell的版本是v2 0 xff0c 现需要将其升级到v5 1 xff0c 过程中有一个环节需要引起注意 xff0c 为了以后查阅的方便 xff0c 现将其记录下来 1 查看PowerShell版本
  • 解决:硬盘安装Ubuntu16.04引导后加载失败

    按照网上硬盘安装Ubuntu的方法 xff0c 配置完毕后每次都在这个画面之后黑屏 xff0c 卡住不动 xff0c 加载失败 网上找了很多办法 xff0c 有的说是UEFI的问题 xff0c 有的说是N卡不兼容 xff0c 尝试了很多都没
  • Appuim+Pycharm+Pytest 自动化测试环境搭建 Mac版

    这一套流程有很多坑 xff0c 因为最近换主机原因被迫搭了2 xff0c 3次 xff0c 忍无可忍打算记录一下超详细的搭建过程 注意 xff1a 下载环境过程中 xff0c 下文有很多链接地址需要访问GitHub外网 xff0c 访问不了
  • [Mac 基础知识]:用Time Machine 恢复mac系统

    如果您使用 Time Machine 来备份 Mac xff0c 则在系统或启动磁盘损坏时可以恢复系统 Important 使用 Time Machine 备份将您的系统恢复到该备份的源 Mac 若 要将信息传输到新 Mac xff0c 请
  • jetson-tx2-4g ubuntu18系统设置中desktop sharing 无法打开的问题

    1 系统设置中desktop sharing无法打开需要进行以下几步 xff1a sudo apt get install vino dconf editor dconf write org gnome desktop remote acc
  • ubuntu18.04安装xrdp过程

    一 安装桌面环境 以具有 sudo 权限的用户身份键入以下命令 xff0c 以在服务器上安装 Xfce xff1a sudo apt update sudo apt install xfce4 xfce4 goodies xorg dbus
  • 瑞芯微RV1126/1109开发流程之模型转换

    1 环境搭建 xff08 PC端ubuntu16 04搭建rknn环境 xff09 xff08 1 xff09 安装anaconda环境 xff08 为了便于管理自己的环境建议安装 xff0c 安装步骤请自行搜索 xff0c 本人安装ana
  • 瑞芯微RV1126/1109开发流程之驱动升级

    1 1126硬件参数读取 xff08 1 xff09 CPU温度读取 46300和47100分别代表46 3 47 1 xff08 2 xff09 查看1126的NPU xff08 3 xff09 查询NPU驱动版本 dmesg grep
  • 如何在 ubuntu 安装并配置Go?

    如何在 ubuntu 安装并配置Go xff1f 虽然安装和配置go很简单 xff0c 但是很多初学者在第一次安装go环境时会遇到各种坑 这篇博客完整演示一次如何在ubuntu上安装和配置golang 第一步 xff0c 查看系统版本 xf
  • 瑞芯微RV1126/1109开发流程之yolov5部署(c++版本)

    1 ubuntu上安装rv1126交叉编译工具链 方式一 xff1a xff08 1 xff09 下载交叉编译工具 交叉编译器概念 xff1a 交叉编译器可以使我们在主机上编译出可以在嵌入式设备上运行的程序 下载地址 xff1a Downl
  • 瑞芯微RV1126/1109开发流程之资料收藏

    RKMedia Firefly Wiki https blog csdn net u013171226 category 11410227 html目前该博主已经建立专栏 RV1109 RV1126系列 3 RV1109 1126 RKNN
  • 瑞芯微RV1126/1109开发流程之opencv交叉编译

    1 下载opencv并解压 这里的opencv版本是我一直用者的opencv3 4 0 没有opencv的可以到这里 xff08 https opencv org releases page 5 xff09 下载 2 创建build和ins
  • yolov5目标检测算法研究之参考资料

    CSP网络架构 深度学习之CSPNet分析 tt丫的博客 CSDN博客 cspnet结构 深度学习入门小菜鸟 xff0c 希望像做笔记记录自己学的东西 xff0c 也希望能帮助到同样入门的人 xff0c 更希望大佬们帮忙纠错啦 侵权立删 目
  • pytorch统计模型参数量并输出

    有时候需要统计我们自己构建的模型参数 与baseline的网络比较 统计神经网络模型参数 方式一 def get parameter number net total num 61 sum p numel for p in net para
  • TCP传输过程中,客户端异常退出导致服务端send函数崩溃

    在linux下编写TCP socket程序时 xff0c 如果客户端突然退出 xff0c 导致连接中断 xff0c 这个时候服务端如果继续调用send函数发送数据的话 xff0c 会导致整个进程退出 xff0c 这是我们不愿看到的 xff0