我制作了一个小程序,我试图处理客户端断开连接。当客户端断开连接时,他发送一个关闭消息,我处理它。但是当客户端被强制关闭时(网络连接丢失,任务被杀死,异常......)服务器仍然将客户端视为已连接。 现在,我试图立即更新此信息,一旦客户端不再连接,他应该被删除。我不能时不时地打他,我可以吗?如果传输正在进行并且我干扰了我的ping命令怎么办?
TL; DR我知道我的客户端是否已经连接了吗?
答案 0 :(得分:0)
当套接字正常关闭时,您将收到关闭消息(从读取尝试返回零字节)...好时光!
如果远程任务被终止且套接字没有正常关闭(或者客户端已经消失但服务器仍在监听的其他情况),则表示“half open socket”。根据情况,检测这些可能很棘手。 应该检测到这一点的TCP has a keep-alive mechanism (主要是在非移动网络上,如果它们已启用)。对于移动连接(特别是flakey GPRS / Edge),您会发现即使保持活动并不总是有效,任何发送数据的尝试都会返回成功。在这种情况下,如果客户端没有向您发送任何数据,您应该在自动超时基础上建立有效连接...当然总是存在客户端尝试重新连接但您似乎已经有套接字的情况坐在那里
答案 1 :(得分:0)
试试这个。它对我有用。
private static bool IsSocketConnected(Socket socket)
{
try
{
return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
}
catch (SocketException) { return false; }
}