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

Jay*_*Jay 2 c sockets

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

怎么避免这个?

caf*_*caf 8

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

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

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