MST

星途 面试题库

面试题:网络编程之非阻塞I/O模型下故障检测基础

在非阻塞I/O模型下,简述如何检测网络连接故障?可以从常见的系统调用和返回值等方面阐述。
18.4万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

在非阻塞I/O模型下,检测网络连接故障可从以下方面着手:

1. send系统调用

  • 返回值含义
    • 成功时,send返回实际发送的字节数。若返回值等于期望发送的字节数,说明数据成功发送出去。
    • 若返回值小于期望发送的字节数,且errno设置为EAGAINEWOULDBLOCK,这意味着当前没有足够的缓冲区空间立即发送所有数据,但连接可能正常,后续可再次尝试发送。
    • 若返回值为 -1,且errnoECONNRESET,表示对方已重置连接,这是一种常见的连接故障,可能是对方异常关闭或网络问题导致连接被重置。
    • errnoEPIPE,表示管道破裂,通常是因为对方关闭了连接,而本地还在尝试向已关闭的连接发送数据。

2. recv系统调用

  • 返回值含义
    • 成功时,recv返回接收到的字节数。若返回0,说明对方已关闭连接(正常关闭)。
    • 若返回 -1,且errnoEAGAINEWOULDBLOCK,表明当前没有数据可读,但连接可能正常,后续可再次尝试接收。
    • errnoECONNREFUSED,表示连接被拒绝,通常是因为目标端口未监听或防火墙阻止连接,这意味着连接建立阶段就出现故障。
    • errnoECONNRESET,同send中的情况,说明对方重置了连接,连接存在故障。

3. selectpollepoll等多路复用系统调用

  • 使用方式及含义
    • 这些系统调用可以监视多个文件描述符(包括套接字)的状态变化。以select为例,通过设置读、写和异常事件掩码来等待文件描述符状态改变。
    • 当一个套接字在select的读集合中就绪时(返回值大于0且对应文件描述符在读集合),调用recv接收数据。若recv返回0,说明对方关闭连接;若recv返回 -1 且为上述连接故障相关的errno值,可判断连接故障。
    • 当套接字在写集合中就绪时(同样select返回值大于0且在写集合),调用send发送数据,根据send返回值判断连接是否存在故障。若select返回值为0,表示在指定时间内没有任何文件描述符就绪,可适当延长等待时间再次尝试。若select返回 -1,且errno不是EINTR(表示系统调用被信号中断,可重新调用),则可能存在系统错误影响连接检测。

4. getsockopt系统调用

  • 使用方式及含义
    • 可通过getsockopt获取套接字的一些选项信息来检测连接状态。例如,获取SO_ERROR选项,该选项返回与套接字关联的待处理错误。
    • getsockopt获取到的SO_ERROR值为0,表示套接字当前没有错误,连接可能正常。若获取到非0值,可根据具体错误码判断连接故障类型,如非0值为ECONNRESET等上述提到的连接故障错误码,即可判断连接出现相应故障。