在我的客户端 - 服务器关系的tcp实现中,我注意到只有客户端套接字能够检测服务器套接字何时关闭 . 没有心跳的帮助,服务器套接字无法检测到客户端断开连接 .
为什么这是一面的?是否有替代心跳来检测连接是否仍然从服务器套接字的角度来看是否仍然存在?链接赞赏!
客户端服务器没有这样的限制 . 这意味着您的实现必须是错误的或您做出错误的假设 .
只有应用程序才能检测到具有TCP / IP的对等方的关闭:
如果本地应用程序尝试读取并且读取失败,因为对等方已关闭连接 .
如果本地应用程序尝试写入并且写入失败,因为对等方已关闭连接 .
如果您既不会尝试读取也不会写入,则无法检测到来自对等方的连接 . 如果您是客户端或服务器,则无关紧要 .
您需要区分TCP连接关闭与“断开连接” . “断开”是什么意思?
连接关闭是TCP协议的一部分,因此如果一方或另一方关闭它的连接,则对方将收到一个指示它的数据包 .
但是,如果一方消失,那么另一方无法知道 .
TCP协议被设计为在恶劣的通信环境中可靠,并且通常不会因为它暂时没有从另一方听到而关闭连接 .
通过在套接字上设置SO_KEEPALIVE选项可以缓解此问题 .
2 回答
客户端服务器没有这样的限制 . 这意味着您的实现必须是错误的或您做出错误的假设 .
只有应用程序才能检测到具有TCP / IP的对等方的关闭:
如果本地应用程序尝试读取并且读取失败,因为对等方已关闭连接 .
如果本地应用程序尝试写入并且写入失败,因为对等方已关闭连接 .
如果您既不会尝试读取也不会写入,则无法检测到来自对等方的连接 . 如果您是客户端或服务器,则无关紧要 .
您需要区分TCP连接关闭与“断开连接” . “断开”是什么意思?
连接关闭是TCP协议的一部分,因此如果一方或另一方关闭它的连接,则对方将收到一个指示它的数据包 .
但是,如果一方消失,那么另一方无法知道 .
TCP协议被设计为在恶劣的通信环境中可靠,并且通常不会因为它暂时没有从另一方听到而关闭连接 .
通过在套接字上设置SO_KEEPALIVE选项可以缓解此问题 .