socket SIGPIPE测试

  1. A端关闭socket,B端连续send
    第一次send成功返回,errno = 0。第二次直接触发SIGPIPE,进程退出,不会有send退出的流程
  2. B端先send一次,A端关闭socket,B端再连续send
    连续send的第一次send返回-1,errno = 104,代表ECONNRESET。第二次触发SIGPIPE,进程退出,不会有send退出的流程
  3. B端连续send,A端待B端阻塞后关闭socket
    首先send从阻塞中返回,errno = 0,但返回值应该小于要写入的长度。比如要写1024个字节,但只返回960个字节(个人理解:缓冲区剩下多少可写就返回多少)。下一次send返回-1,errno = 104,代表ECONNRESET。再下一次触发SIGPIPE,进程退出。

综上:在不忽略SIGPIPE的情况下,靠判断send的返回值来判断是否出错是不可行的。原因就是如果A端先关闭socket,B端send第一次成功返回,第二次就会直接退出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。