在iOS中,为什么在底层网络发生变化时套接字recv不会失败?

时间:2015-09-02 20:26:14

标签: ios blocking berkeley-sockets

在iOS中我有一个使用SO_RCVTIMEO设置超时的阻塞套接字。当我更改设备所连接的WiFi网络时,对recv的调用将适当地超时,但是errno将报告为EWOULDBLOCK并且recv返回-1。

这导致我的外部处理循环尝试再次访问套接字(因为它似乎现在没有可用的数据),但实际上现在这是不可能的,因为设备现在连接到不同的网络端点。

如果我只是完全杀死了网络,在经过多次EWOULDBLOCK之后,几次重复调用recv最终会因ETIMEDOUT而失败。

为什么会这样?套接字连接是否应该被破坏并且使用ENETRESET或类似的errno失败?

如果我没有SO_RCVTIMEO,那么当WiFi网络发生变化时,套接字将永远阻塞。也没有bueno。

编辑:我认为我可以在本地套接字上启用SO_KEEPALIVE,以检测远程套接字由于底层网络端点更改而停止响应的时间。这似乎也不起作用。

0 个答案:

没有答案