在 iOS 中,当我使用 SO_RCVTIMEO 设置了超时设置的阻塞套接字时。当我更改设备连接的 WiFi 网络时,对 recv 的调用将适当超时,但 errno 将报告为 EWOULDBLOCK 并且 recv 返回 -1。
这会导致我的外部处理循环尝试再次访问套接字(因为现在似乎没有可用的数据),实际上此时这是不可能的,因为设备现在连接到不同的网络端点。
如果我完全杀死网络,在多次 EWOULDBLOCK 之后,多次重复调用 recv 最终将失败并出现 ETIMEDOUT。
为什么会出现这种情况?套接字连接不应该因 ENETRESET 或类似的错误而中断并失败吗?
如果我没有 SO_RCVTIMEO,那么当 WiFi 网络发生变化时,套接字将永远阻塞。也没有bueno。
编辑:我认为我可以在本地套接字上启用 SO_KEEPALIVE 来检测远程套接字何时由于底层网络端点的变化而停止响应。这似乎也不起作用。