如果我有100个设备连接到套接字服务器并且客户端断电。重新连接电源后,我将获得100个新的客户端套接字连接。
服务器现在将有200个套接字连接。其中100个被遗弃。
我是否需要检测/处理/关闭这些已放弃的连接,或者.net / windows会检测到这些并在后台清除它吗?
答案 0 :(得分:0)
将关闭连接(假设为TCP)
你会知道那些连接已经死了。究竟如何取决于您的编码。异步你将收到一个内部接收事件。如果同步您的下一次读取或写入失败。
你已经拥有处理不寻常的连接结束的代码(不是你),在这种情况下,你只是一次性获得了很多这些代码
答案 1 :(得分:0)
您描述的场景是TCP" KeepAlive"的目的之一。设置。因为TCP协议通常不要求任何一方说出任何事情,除非它有理由相信它知道另一方没有关于连接的事情,那么任何一方都没有任何说法的连接。它的最后一个数据包被确认不会产生任何流量。因此,不可能区分已经不存在的设备与活着和连接的设备,但根本没有它想要说的任何东西。
如果连接的一方有" KeepAlive"设置,然后如果经过一定时间(通常是几分钟)没有任何方向的任何流量,该方将假装忘记"它收到了它发送的最后一个字节的确认,因此将重新发送该字节。如果连接的另一方仍然存在,它将看到重传并将其识别为(忽略其中的数据),但它将发送确认,前提是对方可能错过了先前的确认,甚至如果对方确实看到早先的确认转发它将是无害的。如果连接的另一方确实存在,但对连接一无所知,它将立即发送" reset"数据包指示,从而终止连接。如果连接的另一方不存在,则重传的字节将永远不会被确认;在多次尝试重新发送该字节后,尝试发送该字节的一方最终将放弃并终止连接。
启用KeepAlive将确保如果连接的一侧消失,另一方最终会发现它。 KeepAlive时间通常相当长(分钟),KeepAlive时间仅设置一方开始寻找另一方时的点。如果对方完全消失,系统可能需要一分钟左右的时间来决定另一方是否真的消失了。不过,几分钟后发现对方的失踪往往比从来没有发现过更好。