2013-04-22 192 views
1

我有一个tcp客户端/服务器,我想检测客户端的连接丢失;因为我的客户端有多个接口,并且我一次连接到其中一个接口的服务器,所以我想知道如何检测客户端的连接丢失,以便我可以将我的tcp客户端与另一个接口连接到服务器,并且如果所有这些接口我将我的数据存储在文本文件中。我GOOGLE了它,我已经看到保持活力,但它不是我想要的。如何检测tcp客户端连接到c + +服务器

如果它很重要我的项目是在linux和代码是在c + +。

回答

3

我发现的最好方法是检查缓冲区,如果缓冲区为空,这意味着您的TCP客户端将数据包成功发送到TCP服务器,您可以发送下一个数据包;检查缓冲区,你可以使用SIOCOUTQ;它非常易于使用,并向您显示您的缓冲区中有多少数据。

+0

好主意。如果您过早检查ioctl,您如何避免竞争状况?另外[SIOCOUTQ似乎是Linux专用](http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable )意味着这不是Windows开发人员的解决方案。 – 2013-04-26 04:02:56

+1

@SergeIvanoff我知道它不支持在Windows中,但正如我在Linux中编码的问题中提到的,我寻求我的问题的解决方案;我没有问这个问题来解决别人的问题! 如果我太快检查ioctl我会等待它响应,如果我得到错误我没有关闭我的套接字,如果ioctl没有响应,但我会等待将近1分钟,如果在这段时间我的数据仍然在缓冲区I将关闭我的套接字。 – Lrrr 2013-04-27 09:02:43

1

尝试从套接字读取。当套接字关闭时,读取将失败,给您简单的检测。您可以在专用检测线程中执行此操作,以便您的主线程不会阻塞。

+0

如果一个接口损失连接到互联网剂量这关闭插座?(我的接口都是3G) – Lrrr 2013-04-22 10:50:10

+0

是的。远程机器可能需要一点时间才能注意到(但为了防止由于两台机器之间的网络问题而导致错误的套接字关闭,您需要花费这段时间)。 – mah 2013-04-22 11:09:08

+0

为什么你会打开一个连接,并且没有读线程?我不是说在一个单独的线程中。我的意思是,如果你没有从套接字读取数据,有一个客户端连接有什么意义? – 2013-04-22 12:45:41

1

TCP连接被设计为纠错而不是时间关键。此错误更正包括网络超时。

直到套接字实际关闭,读取和写入才会失败,这可能不会很长时间。

客户端决定连接是否超时的唯一方法是让客户端检测到它在指定时间内没有收到任何消息,然后手动关闭套接字。

这就是Keep Alive消息的用途。

+0

我的客户将不会收到任何消息!由于我们的设计只有客户端会发送消息到服务器!如果我的客户端收到消息,我将很容易检测到客户端和服务器连接! – Lrrr 2013-04-23 13:27:48

+0

在这种情况下,没有办法。如果存在网络延迟,则在重新建立连接后,TCP缓冲消息以尝试恢复。我肯定有一些原因,如果你写了太多的数据,你会得到一个“缓冲区已满”的消息,但这取决于底层的网络缓冲区大小。您的服务器设计必须更改为发送保持活动状态(或状态消息,如果您喜欢)。 – 2013-04-24 00:33:21

+0

我解决了这个问题,没有keepalive和其他服务器响应。 – Lrrr 2013-04-24 13:35:04