2014-09-03 42 views
0

我有一个客户端服务器应用程序,它们都通过tcp进行通信。我们计划重用tcp内置保活机制来确保客户端和服务器都知道其他人还活着。什么是应用程序知道tcp保持活动失败的好方法?

几个问题:

  1. 现在,我们已经做了setsockopt的(..)启用TCP保活,也设置了保活超时值。让我们假设应用程序闲置。我希望应用程序知道保持活动超时......这意味着客户机 - 服务器连接已关闭。该应用程序然后必须显示错误页面。什么是应用程序知道的好方法?我相信,如果一个tcp保持超时状态,随后尝试通过该套接字发送msg将返回一个WSAENETRESET错误,但我希望应用程序知道它即使空闲并且没有消息流动。

我想执行以下操作: 有运行,每20秒(持续时间可以增加/减少),并做了setsockopt的设置保持活动为true的循环。如果连接中断,此调用将返回WSAENETRESET错误。

  1. 什么是一个很好的保活间隔使用?

  2. 在构建的保持活动机制中使用tcp的任何问题?

在此先感谢...

回答

0

没有什么特别的,你需要做的。据推测,你已经试图从套接字中读取数据,或者正在等待它准备好读取数据。如果连接失败,它将准备好读取(因为您不能再等待它准备好读取),并且您的读取尝试将会出错。

+0

你的意思是有一个阻塞recv调用,通常会读取数据,但如果保持活动超时,它将返回一个WSAENETRESET错误。 – techieChamp 2014-09-03 15:29:51

+0

@techieChamp如果这就是你如何接收数据,那么是的。如果您以其他方式接收数据,那么无论其他方式如何。据推测,你已经有了一些机制来接收来自连接的数据,无论是“轮询”,“选择”,重叠I/O,阻塞读取或其他。 – 2014-09-03 15:32:20

+0

现在,我们正在使用send,然后是recv。我们一直在做原型工作,但将重新安排它作为一个单独的调用在不同的线程recv。 – techieChamp 2014-09-03 15:43:37

0

关于检查永葆方式:

如果程序被阻止读取流永葆失败,将因错误而中断。如果你的程序不需要等待传入的消息,你可以产生一个线程。

另一个问题是,如果您确实需要每20秒检查一次,或者您可以检查何时需要发送消息。

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

关于你的问题:

  1. 默认值通常为2小时,这些都是轻量级的数据包,所以你可以把它要低得多,但除非真的有必要,我不会超过一分钟使用值。
  2. 没有,我知道。
相关问题