0

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

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

如果我完全杀死网络,在多次 EWOULDBLOCK 之后,多次重复调用 recv 最终将失败并出现 ETIMEDOUT。

为什么会出现这种情况?套接字连接不应该因 ENETRESET 或类似的错误而中断并失败吗?

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

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

4

1 回答 1

0

我会在这里发布我自己的答案。事实证明,在使用keepalive时,必须首先启用socket级别的SOL_SOCKET,并在TCP层设置keepalive间隔(IPPROTO_TCP级别和TCP_KEEPALIVE),因为默认通常是7200秒(2小时)。

int on = 1;
int delay = 120;
setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
setsockopt(socket_handle, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay));

我根据类似的帖子遇到了语法。

是否可以在 Apple iOS 设备上激活 TCP keepalive

于 2015-09-10T14:55:25.047 回答