socket的sigpipe信号[通俗易懂]

socket的sigpipe信号[通俗易懂]对一个对端已经关闭的socket调用两次write,第一次将会收到队端的RST响应,第二次将会生成SIGPIPE信号,该信号默认结束进程.具体的分析可以结合TCP的”四次握手”关闭.TCP是全双工的信道,可以看作两条单工信道,TCP连接两端的两个端点各负责一条.当对端调用close时,虽然本意是关闭整个两条信道,但本端只是收到FIN包.按照TCP协议的语义,表示对端只是关闭…

大家好,又见面了,我是你们的朋友全栈君。

对一个对端已经关闭的socket调用两次write,第一次将会收到队端的RST响应, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.

具体的分析可以结合TCP的”四次握手”关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 它仍然可以通过另外一条信道继续接收数据. 也就是说, 因为TCP协议的限制, 一个端点无法获知对端的socket是调用了close还是shutdown.

对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送). 但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以, 第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.

为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:

signal(SIGPIPESIG_IGN);

这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE. 程序便能知道对端已经关闭.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139135.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动手小游戏_飞机大战激活成功教程版

    动手小游戏_飞机大战激活成功教程版一、关于飞机大战要说微信中最火爆的小游戏是哪款,可能既不是精心打造的3D大作,也不是《植物大战僵尸2》,而是微信5.0刚开启时的《飞机大战》。就是这样一款铅笔手绘风格的简单到不能再简单的“打飞机”

    2022年8月5日
    7
  • python break和continue

    python break和continuebreak语句break语句是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句。>>>whileTrue:…s=input(‘Entersomething’)…ifs==’quit’:…break…print(‘aa’)…..

    2022年5月13日
    43
  • java游戏开发入门教程_JAVA制作游戏入门教程

    java游戏开发入门教程_JAVA制作游戏入门教程现在流行的游戏似乎都是用C或C++来开发的。在java平台上几乎没有很大型及可玩的流行游戏。由于java是个新生语言,他的许多特性还有待大家的发掘,但是我们不能否认Java在游戏编程方面的强大性。本文将带领大家一步一步学习编写Java游戏。最终打造属于自己的Java游戏。在开始之前我们得确认你已经安装了JavaJDK,并已经安装了浏览器软件如IE。本章是以Internet为开发对象,一步一步教大…

    2022年7月7日
    22
  • java jwt 单点登录_JWT实现单点登录

    java jwt 单点登录_JWT实现单点登录importcom.atguigu.commonutils.JwtUtils;importcom.atguigu.commonutils.MD5;importcom.atguigu.eduservice.entity.UcenterMember;importcom.atguigu.eduservice.entity.vo.RegisterVo;importcom.atguigu.edus…

    2022年5月21日
    37
  • 轻量级神经网络发展_宽度神经网络

    轻量级神经网络发展_宽度神经网络文章目录轻量级神经网络——shuffleNetshuffleNet1逐点分组卷积(Pointwisegroupconvolution)✨✨✨通道重排(channelshuffle)✨✨✨shuffleNetUnit✨✨✨shuffleNet1的网络结果和效果轻量级神经网络——shuffleNetshuffleNet1  在之前,已经讨论过一种轻量级神经网络——MobileNet,文中对MobileNet的三个版本都做了详细的介绍,读此篇之前,建议先了解MobileNet,特别是要对其中的深度可

    2025年10月9日
    3
  • tcp三次握手题目(tcp三次握手面试题)

    TCP的报头:1.源端口号:表示发送端端口号,字段长为16位。2.目标端口号:表示接收端口号,字段长为16位。3.序列号:表示发送数据的位置,字段长为32位。每发送一次数据,就累加一次该数据字节数的大小。注意:序列号不会从0或1开始,而是在建立连接时由计算机生成的一个随机数作为其初始值,通过SYN包发送给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。…

    2022年4月14日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号