套接字服务器打开显示未知文件异常,TCP-socket异常情况

本文详细介绍了在Unix环境下,TCP网络编程中可能遇到的各种异常情况,包括应答超时、目的不可达、禁止分片等,并给出了相应的错误处理策略,如连接超时、服务端崩溃后的处理等。
摘要由CSDN通过智能技术生成

在Unix下进行网络编程时,由于网络并非完全可靠,会遇到各种协议主流程外发生的各种错误。

而健壮的程序必须考虑到这些错误并正确处理,因此这里总结网络编程中可能发生的常见错误。

TCP异常流程

总体

应答超时

​ 在握手,挥手以及消息传递的状态下,若当前发送的报文期待一个应答报文。在规定时间应答报文没有到达,发送方会重发两次报文(报文重发间隔可设置)。若重发三次后依旧没有收到应答,则向应用返回ETIMEOUT

目的不可达

​ 若报文在传送的过程中,因为找不到路由路径,报文无法到达等引发了ICMP错误,发送方会按照上述的方式重发次报文。若重发结束后依旧没有收到应答,则向应用返回EHOSTUNREACH或者ENETUNREACH

禁止分片

​ 在IPV4中,报文超过了MTU长度会导致分片,而其存在DF(Don't Fragment)标识,表示禁止分片。同时IPV6禁止路由器分片,因此在传送的过程中隐含DF位。在传送过程中设置了DF位而超过了MTU,则会向应用返回EMSGSIZE

阻塞时中断

​ 在系统执行慢系统调用(可能被永远阻塞的系统调用)时阻塞,此时捕获到某个信号并进行了处理(系统对某些信号有默认处理方式),在没有设置自动重启的情况下,会向应用返回EINTR。

​ 一般应对EINTR的方式是简单的重新调用,但在connect返回EINTR时不能这么做,因为connect涉及三次握手的过程,需要使用getsockopt获取连接状态。

读写时RST

​ 在调用read等阻塞时接收到对端RST信号时,会返回ECONNREST。同时对发送方断开的套接字写时也会返回ECONNRESET

写RST套接字

​ 当进程向收到RST的套接字执行写操作的时候,内核向该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿的被终止

​ 不论进程是捕捉了该信号并从信号处理函数中返回,还是简单忽略该信号,写操作都讲返回EPIPE错误

握手部分

首次握手服务端RST

bVbKcAs

​ 在客户端第一次握手时,若服务端返回RST报文,立即向应用返回ECONNREFUSED

握手结束客户端RST

bVbKcAJ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值