手动检查套接字连接是否很重要?

时间:2014-05-02 21:17:56

标签: c++ c sockets

例如,让我们考虑一下IRC协议;那里有PING / PONG来检查客户端是否还在等待。因此,在实现我自己的IM简单协议时,我遇到了一个问题:我们现在真的需要做这样的检查吗?可以依靠套接字连接那么多,不要手动检查吗?在此先感谢:)

2 个答案:

答案 0 :(得分:0)

基本上,这是你的电话。你的协议,你的代码,你决定它。答案是你实际上并不需要它,但它是一个很好的功能。从个人经验来看,我可以告诉你,如果客户突然离开,它会避免鬼连接并尽快终止它们。

当然,最终,半开连接最终会被关闭,但可能需要一些时间。我不是在谈论几秒钟 - 它真的需要几分钟。这令人沮丧且不受欢迎。几个月前,当我实施一个IRC服务器作为大学项目的一部分时,我自己检查过这个问题(如果你感兴趣的话:https://github.com/filipegoncalves/yaIRCd - 它实现了一个非常严格的IRC协议子集,我没有&# 39;触摸它一段时间。)

所以,我的建议是去做它并使用PING / PONG,但是如果这看起来像很多工作并且你只是想让某些东西起作用,你可以放弃它而不会产生严重的后果 - 只是请记住,你可以拥有许多不再存在的幽灵用户!

答案 1 :(得分:0)

如果您 CAN 在您的自定义协议中设计了一个明确的ping / pong系统,那么应该这样做(并非所有协议模型都可以提供它)。

不,您不能依赖管理连接的套接字。例如,并非所有平台都支持TCP保持活动。或者插座可以在中途部分关闭(即,关闭以进行读取但不用于写入,反之亦然)。或者连接可能会在不告诉任何人的情况下异常丢失,并且操作系统检测到死连接可能需要很长时间(几分钟甚至几小时)(这主要是为什么首先创建了Keepalive和ping / pongs)。等等。

因此,如果您 CAN 明确指出一方告诉对方该连接仍然存在且故意保持打开状态,请执行此操作。如果连接闲置一段时间,请ping它。如果乒乓球超时,则假设连接已死并关闭它。并且 IF 可能,设计您的协议,以便任何一方可以随时ping另一方。但 IF 是不可能的,至少试图让ping在一个方向上流动(客户端到服务器,或服务器到客户端) IF 可行。