socket编程—— 服务器遇到Broken Pipe崩溃

 

1 现象描述

   服务端 自动退出

2 原因分析

 

socket编程—— 服务器遇到Broken Pipe崩溃_第1张图片

socket编程—— 服务器遇到Broken Pipe崩溃_第2张图片

 

如何知道 对端已经关闭 阻塞模式下 发生交互

1 read返回值 包大小为零。

2  send 返回值-1 ,抛出 SIGPIPE异常

如果程阻塞

1 read,没有交互 根本不知道不知道对端是否连接正常----> 默认情况下等到2个小时之后才知道

TCP的keepalive机制

2 send 阻塞与缓冲区大小 一般忽略不计。很快就是知道连接是否成功。结果是2

总结:

 

 

3 场景还原:

--网络摘抄  SIGPIPE Default action Abnormal termination of the process

发生场景:

在Unix系统下,如果send在等待协议传送数据时网络断开的话(以前建立过连接),调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

预计结果:默认情况下 一端因为其他原因断开 ,另外一端自动断开。在工作中并不是这样的 例如服务端断开了。业务连接并没有退出。是因为屏蔽了该信号。

测试结果:

默认情况下:

 server:
 recv=8 bytes from client,package:client:7 
^C
client:
 client has send for 8 bytes data=client:7
 client has send for 8 bytes data=client:8---发送一次成功 第二次send时候出错
case 1  client 异常终止终止(ctl-c)
       服务端read检测到连接断开 然后退出
client:

client has send for 8 bytes data=client:0
client has send for 8 bytes data=client:1


^C[wang@localhost socket]$

server
sokcet =4 client=127.0.0.1:port=58602
recv=8 bytes from client,package:client:0
recv=8 bytes from client,package:client:1
recv=0 bytes from client,package:client:1

1 假如服务端异常,客户可以继续发送吗?可以 但是发送结果是失败

client has send for -1 bytes data=client:4
=================errno=32..
client has send for -1 bytes data=client:5
=================errno=32..
client has send for -1 bytes data=client:6

3  疑问:

recv函数也会产生SIGPIPE吗?

 

 

                 整理思路不是很清楚 都是自己随时想到的 请谅解如果有疑问请加我微信wang_cyi

你可能感兴趣的:(socket编程—— 服务器遇到Broken Pipe崩溃)