Sockets 对于应用程序来说,什么是了解tcp保持活动是否失败的好方法?

Sockets 对于应用程序来说,什么是了解tcp保持活动是否失败的好方法?,sockets,tcp,keep-alive,Sockets,Tcp,Keep Alive,我有一个客户端-服务器应用程序,两者都通过tcp进行通信。我们计划重用tcp内置的keep alive机制,以确保客户端和服务器都知道另一个家伙还活着 有几个问题: 现在,我们已经完成了setsockopt(..)以启用tcp保持活动,并且还设置了保持活动超时值。让我们假设应用程序处于空闲状态。我想让应用程序知道保持活动超时…这意味着客户端-服务器连接已关闭。然后应用程序必须显示一个错误页面。应用程序了解这一点的好方法是什么?我相信,如果tcp保持活动超时,随后通过该套接字发送消息的尝试将返回W

我有一个客户端-服务器应用程序,两者都通过tcp进行通信。我们计划重用tcp内置的keep alive机制,以确保客户端和服务器都知道另一个家伙还活着

有几个问题:

  • 现在,我们已经完成了setsockopt(..)以启用tcp保持活动,并且还设置了保持活动超时值。让我们假设应用程序处于空闲状态。我想让应用程序知道保持活动超时…这意味着客户端-服务器连接已关闭。然后应用程序必须显示一个错误页面。应用程序了解这一点的好方法是什么?我相信,如果tcp保持活动超时,随后通过该套接字发送消息的尝试将返回WSAENETRESET错误,但我希望应用程序知道它是否空闲且没有消息流动
  • 我想做以下几件事: 有一个循环,每20秒运行一次(持续时间可能增加/减少),并执行setsockopt将keep alive设置为true。如果连接断开,此调用将返回WSAENETRESET错误

  • 什么是好的保持活动间隔

  • 使用tcp内置的保持活动机制有什么问题吗


  • 提前感谢…

    您没有什么特别需要做的。您可能已经在尝试从套接字读取数据,或者适当地等待它准备好读取。如果连接失败,它将准备好读取(因为您不能再等待它准备好读取),您的读取尝试将出错。

    关于检查保持活动状态的方法:

    如果程序在读取流时被阻止,并且保持活动失败,则程序将因错误而中断。如果您的程序不需要等待传入消息,您可以生成一个线程来执行该操作

    另一个问题是,你是否真的需要每隔20秒检查一次,或者你可以在需要发送消息时检查一下

    If find keep alive在服务器端特别有用,程序在服务器端等待消息,因为否则服务器将永远不会知道连接已断,并且将永远等待传入消息(浪费线程和端口)

    关于你的问题:

  • 默认值通常为2小时,这些是轻量级数据包,所以可以将其保持在较低的水平,但我不会使用低于1分钟的值,除非真的有必要
  • 不,我知道

  • 您的意思是有一个正常读取数据的阻塞recv调用,但如果keep alive超时,它将返回WSAENETRESET错误。@TechIcehamp如果这就是您接收数据的方式,那么是的。如果您以其他方式接收数据,那么无论其他方式是什么。想必,您已经有了某种从连接接收数据的机制,无论是
    轮询
    选择
    、重叠I/O、阻塞读取,还是其他任何形式。现在,我们使用的是先发送后接收的方法。我们一直都在做原型工作,但会重新安排它,将recv作为另一个线程上的单独调用。@techieChamp如果你知道另一方不会首先发送的事实,那么你可能不得不使用丑陋的黑客。一个选项是
    getpeername
    ,另一个选项是
    getsockopt(SO_ERROR)
    。如果可以,在通信协议中实现一个显式的keepalive消息,不要依靠TCP keepalive本身。这样,客户机和服务器可以定期地彼此说“我还在这里”(在某些平台上无法配置TCP keepalive的间隔)。如果其中一个在一段时间后没有收到这样的消息,那么不管TCP keepalive怎么说,只要假设连接已断开并将其关闭即可。