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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分布式搜索elasticsearch 文献检索索引 入门

    分布式搜索elasticsearch 文献检索索引 入门

    2022年1月2日
    56
  • DHCP配置命令(DHCP配置命令)

    #DHCP动态主机配置协议,用来分配IP地址等网络参数。用户上网需要条件:IP地址,网关,DNS…注意:除非有特殊需求会采用静态配置(企业员工比较多的企业)路由器、核心交换机、Linux、服务器上面都可以配置DHCPDHCP配置实验:[Huawei]dhcpenable:开启DHCP服务[Huawei]ippoolaa:在路由器上创建IP地址池[Huawei-ip-pool-aa]network192.168.1.0mask24:给IP地址池添加IP地址网段[Huawei-i

    2022年4月18日
    55
  • 个人微信号API接口,微信机器人

    个人微信号API接口,微信机器人前段时间公司需求开发一套自定义的微信机器人,需求是可以自己批量添加好友、批量打标签等进行好友管理,社群管理需要自动聊天,自动回复,发朋友圈,转发语音,以及定时群发等,还可以提取聊天内容,进行数据汇总,收藏快捷回复各种功能!一堆需求砸下来,调研开发了3个月,3个月啊!!!(主要被各种技术走偏路),终于成功了,都是走过的心酸泪,分享给大家,大家学习完,记得给我点个赞!!!大家一般需求点无非是以下几个需求:1.开发个人微信营销系统2.开发自定义的微信机器人,3.开发微信智能聊天客服系统

    2022年5月18日
    78
  • php taglib,thinkphp中 taglib标签应用

    php taglib,thinkphp中 taglib标签应用1 配置文件中加上 APP AUTOLOAD PATH gt TagLib 2 在项目的 Lib 下新建 TagLib 文件夹复制 TagLibHtml class php 到该目录下面也可以自己定义格式 Tag 大驼峰命名 class php 实例 TagLibCms class php 代码下面 3 模版或 hhhTagLibCms class php 的代码 code

    2025年7月18日
    6
  • mysql通配符转义_转义MySQL通配符

    mysql通配符转义_转义MySQL通配符小编典典_而%不是通配符在MySQL一般,而且不应该被转义,将它们放入普通的字符串字面量的目的。mysql_real_escape_string是正确的,足以满足此目的。addcslashes不应该使用。_并且%仅在LIKE-matching上下文中是特殊的。当您想为LIKE语句中的文字使用准备字符串时,要100%匹配百分之一百,而不仅仅是以100开头的任何字符串,都需要担心两种转义。首先是喜欢转…

    2022年6月16日
    45
  • Windows下载Android SDK[通俗易懂]

    Windows下载Android SDK[通俗易懂]压缩包的下载链接下载。。。下载完成后解压,现假设目录为D盘下Android_SDK文件夹中打开SDKManager.exe这里面出现的内容没必要全部下载,我们只需要下载一些必用的,然后随着需

    2022年7月1日
    26

发表回复

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

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