在阻塞recv呼叫的情况下,如果对等端系统重新启动,则呼叫不会出现recv。为什么?

时间:2010-08-30 10:33:07

标签: c sockets

当我的代码处于阻塞recv调用中时,如果另一方重新启动,那么此方recv调用无法了解它并且只是进入挂起状态。

如何避免这种情况?

1 个答案:

答案 0 :(得分:8)

默认情况下,如果连接的另一侧在没有正确终止连接的情况下消失,则您身边的操作系统无法知道没有其他数据可用。这就是recv()在这种情况下永远阻止的原因。

如果您想要超时,请将套接字设置为非阻塞,并使用select()等待它变为可读。 select()允许您指定超时。

或者,您可以使用SO_KEEPALIVE设置setsockopt()套接字选项。这将启用TCP“keepalives”的发送,这将允许您的一方检测过时的连接。 (请注意,使用默认设置,可能需要时间来检测连接已经消失)。