客户端程序异常退出

来源:互联网 发布:开学典礼上的讲话知乎 编辑:程序博客网 时间:2024/04/28 06:53

实验环境:

(1) 构建一个收发服务器,使用OPENSSL方式建立TCP连接,收发服务器针对每条新连接,只发送一次数据,并接收一次来自客户端的数据,就将TCP连接关闭

(2) 构建一个发送客户端,使用OPENSSL成功建立TCP连接之后,接收一次来自服务器的数据,重复发送三次数据


实验结果:

(1) 收发服务器正常接收到了一次客户端发送的数据,

(2) 客户端接收到来自服务器的数据,第一次发送成功,第二次也发送了,发送第三次时客户端程序就退出了


原因分析:
A.  服务器端分析:

服务器与客户端建立TCP连接之后,在一收一发之后就将TCP连接关闭,

B. 客户端发分析

客户端第一次能发送成功,是因为此时TCP连接没有关闭,那第二次也发送出去了,此时并没有引起程序退出,为什么一定要发送第三次才退出呢?


结合之前分析TR069连接的问题以及服务器端主动将TCP连接关闭掉,而客户端没有也不知道此条TCP连接已经关闭,而是一直发送数据,想到是SIGPIPE的信号导致的问题,

后面在客户端程序那边,针对SIGPIPE信号安装其他处理函数,结果不退出了,参考下其他web服务器对SIGPIPE 的信号的处理都是设置为IGN(忽略),而SIGPIPE信号的默认处理方式是进程退出,这与实验结果吻合。


为什么会产生SIGPIPE信号:

当往关闭的TCP连接发送数据,此时服务器端会返回一个RST的报文,如果再往此连接发送数据,本机就会产生SIGPIPE信号,如果不正确处理此信号,就会出现上面的结果,且不会有任何的调试信息,到这里,应该明白了为什么上面一定要发送三次才会出现

发送第一次时,服务器端正常接收,但接收之后就将TCP连接关系,此时客户端应该会接收到一个FIN报文,即read返回0;

当第二次往服务器发送数据时,服务器就返回个RST报文;

当第三次发送时,协议栈已经标明此连接被关闭,从而触发SIGPIPE信号。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机充电板坏了怎么办 闪电宝商户乱跳怎么办 网易邮箱发错了怎么办 苹果手机邮件无法连接服务器怎么办 好记星平板电脑开不了机怎么办 邮箱里的文件过期了怎么办 小米手机邮件发不了怎么办 有人加我qq邮箱怎么办 文件太大发邮件太慢怎么办 爱又米发信息怎么办 手机上电子邮件己停止运行怎么办 苹果电子邮件密码忘了怎么办 玩游戏时电脑烫怎么办 qq邮箱独立密码忘记了怎么办 qq邮箱中转站容量不足怎么办 qq邮箱忘记密码了怎么办 qq邮箱超大附件过期怎么办 忘记qq邮箱独立密码怎么办 网易邮箱账号忘了怎么办 微信登录密码忘了怎么办 微信太久没登录登录不上怎么办 邮箱独立密码忘记了怎么办 苹果设置id没有邮箱怎么办 苹果手机设置id没有邮箱怎么办 邮箱的附件过期了怎么办 邮箱里的附件过期了怎么办 邮箱中附件过期了怎么办 扣扣邮箱附件过期怎么办 公司网页版邮箱进不去了怎么办 农行客户端密码忘记了怎么办 中国银行客户端密码忘记了怎么办 建行客户端登录密码忘记了怎么办 中国移动客户端密码忘记了怎么办 再歪一点授权码绑定怎么办 网易邮箱号忘了怎么办 忘记支付宝账号和密码怎么办 支付宝账号密码忘了怎么办 发邮箱文件超2g怎么办 报考计算机二级邮箱不存在怎么办 苹果邮箱登录要imap密码怎么办 注销微信支付后怎么办