当我的代码处于阻塞recv调用中时,如果另一方重新启动,那么此方recv调用无法了解它并且只是进入挂起状态。
如何避免这种情况?
答案 0 :(得分:8)
默认情况下,如果连接的另一侧在没有正确终止连接的情况下消失,则您身边的操作系统无法知道没有其他数据可用。这就是recv()
在这种情况下永远阻止的原因。
如果您想要超时,请将套接字设置为非阻塞,并使用select()
等待它变为可读。 select()
允许您指定超时。
或者,您可以使用SO_KEEPALIVE
设置setsockopt()
套接字选项。这将启用TCP“keepalives”的发送,这将允许您的一方检测过时的连接。 (请注意,使用默认设置,可能需要长时间来检测连接已经消失)。