当插座中的连接断开时会发生什么(C)

时间:2011-02-25 04:15:42

标签: c sockets network-programming

好的,所以这似乎是一个相当直接的问题,但我觉得我已经阅读了有关套接字编程的每篇文章,我都能找到并且没有找到满意的答案。我先来描述一下我编程的系统。我道歉,但我必须对NDA目的非常模糊,但这足以让我的问题得到解决。

我正在编写一个带有线程池的中央多线程C服务器。有两种类型的客户端,类型A和类型B.每种类型有数千种。类型A是为类型B执行操作的工作者。类型A不断地向服务器更新有关其自身的信息(例如,每15秒)。 B类仅在需要完成任务时与服务器通信,此时服务器选择A客户端并为其分配作业。这大概是24/7,并且非常时间敏感。

我决定使用持久性TCP模型 - 这意味着只要B要求完成工作,服务器就可以立即将信息发送到A,而无需等待有问题的A连接到服务器。此外,如果每个A每15秒与服务器通信一次,那么继续建立连接将是一个很大的开销。

如果服务器选择的A不可用,则需要尽快选择新的A,因为B非常不耐烦。

我的问题是,如何判断连接是否已断开?我不是在谈论一个插座被关闭,而是不再连接。例如,B1希望完成工作,服务器选择A1并向其发送请求。但是,有人决定剪断以太网电缆。我无法让服务器愉快地将数据发送到A1,直到连接超时几分钟。我可以在尝试发送消息之前ping客户端吗?这会引入太多的延迟吗?可以做些什么?

1 个答案:

答案 0 :(得分:4)

在我看来,唯一可靠的方法是使用计时器。如果回复时间太长,则假设它已断开连接。将其踢入要修复的服务器池中,每隔一段时间检查一次,看看是否恢复了连接。

这基本上是金融服务行业处理市场数据馈送的方式。如果您没有足够快地得到响应,您就不能再信任发件人,并且应该忽略它,直到情况有所改善。对于某些应用程序,它们甚至通过两个不同的网络路径(使用隧道,MPLS-TE,两个多播树)发送每个数据包的两个相同副本,以便在需要时始终提供备份数据包。

在您的情况下,您可以选择其他工作人员并将任务发送给他们。

相关问题