尝试了一些不同的方法来检测远程Socket是否已断开连接。
我目前正在检查插座是否已连接。
public void CheckSocket()
{
try
{
bool test1 = s.Poll(_MicrosecondFaultTolerance, SelectMode.SelectRead);
bool test2 = (s.Available == 0);
if (test1 && test2)
_Active = false;
}
catch
{
_Active = false;
}
}
由于某种原因,这种情况完全适用于每次没有问题时的第一滴,但在此之后检查不会将_Active设置为false,因此客户端永远不会被视为“断开连接”。有没有其他方法可以测试Connection或者有更可靠的结果。
答案 0 :(得分:2)
我不确定“第一滴”是什么意思,因为一旦插座下的连接断开,插座必须关闭。这一切都取决于你在CheckSocket()
函数之外所做的事情。但假设所有处理都正确,如果底层连接空闲,简单地轮询套接字将无法可靠地工作。
只有在底层传输上有某些流量时才能检测到断开连接。如果连接在闲置时被放弃(未关闭),它将永远静静地坐在那里。要在空闲时检测已放弃的连接,请将setsockopt()
与SO_KEEPALIVE
一起使用。 TCP将定期与另一方交换虚拟流量,以测试连接是否仍处于活动状态,并防止任何NAT或其他动态路由规则超时。请注意,检测丢弃可能需要30秒或更长时间,因为这是TCP的默认超时。