因为socket接收超时与事件等待函数的等待时限不属于同一个控制范围。Linux的socket说明明确,SO_RCVTIMEO和SO_SNDTIMEO对执行socket输入输出的系统调用起作用,对select、poll、epoll_wait没有这样的效果。因此,程序设了接收超时,仍在epoll_wait里等待,并不能仅凭这一项就判断配置失效或网卡卡死。

适用前提是程序确实在Linux上使用这套socket选项,并已确认卡住的位置是哪个调用。若日志只写了“等待网络”,还没有调用对象、选项设置结果与等待入口,不能直接套本结论。其他系统、第三方网络库和应用自定义截止时间,都须按各自文档核对,不把一个socket的设置当作整个进程的总时限。
观察时把设置选项、开始执行输入输出、进入事件等待这三个时点分开。若程序此时在事件等待接口中,应由软件维护者检查该等待自己的时限约定;若实际在执行阻塞输入输出,再按对应选项与真实返回核对。不要因为界面都显示“等候”,就把不同等待层次的结果混在一起。
返回值也要保留完整语义。官方说明,阻塞期间如果已有数据传输,函数可能返回实际已传输数量;没有数据传输而达到时限时,再按所列错误返回。超时不是原业务已经完成的证明,也不能从一段部分数据就假定已经接收完整内容。本文没有更改客户socket、等待循环或远程连接,也没有制造超时来验证。
风险是为避免等待而把全部接口改成非阻塞、连续轮询或反复重发原请求,既可能增加CPU占用,也可能重复业务操作。下一步先交接去敏的等待入口、时限配置、实际返回与原业务状态,由原维护者判断应调整哪一层。渝中区台式电脑用户可拨400-877-9605,先说明是应用等待还是链路已报错;电脑快修网提供信息展示及第三方维修对接,具体电脑侧检查是否支持、地址和安排当次确认。