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