1

是否可以检查客户端套接字目前是否保持连接活动?我使用使用 AsyncCallBack 操作的多线程服务器。关于这个问题有很多类似的问题,我已经阅读了 Socket.Poll 方法 - 一切都无法正常工作。

尝试应用此示例:

    bool IsConnectedAviable(Socket s)
    {
        try
        {
            if (s != null && s.Connected)
            {
                if (s.Poll(0, SelectMode.SelectRead))
                {
                    byte[] buff = new byte[1];
                    if (s.Receive(buff, SocketFlags.Peek) == 0)
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }

                return true;
            }
            else
            {
                return false;
            }
        }
        catch
        {
            return false;
        }
    }

提前致谢!:)

4

2 回答 2

2

如果您从另一端收到一些东西,您就知道连接仍然存在。如果您有一段时间没有从另一端收到任何东西,那么确定连接是否仍然存在的唯一方法是发送一些东西。

于 2012-06-20T13:20:19.867 回答
0

我认为你必须改变你对 Sockets 的看法。稍微简化一下,它们有两种状态:“肯定断开”和“可能断开”。相应地编码。在“可能已断开连接”状态下,您能做的最好的事情就是尝试发送数据。如果您使用 TCP,并且交付成功,则不会发生任何事情。如果没有,你会得到一个异常——但只是几秒钟后,在 TCP 尝试重试之后。

这是物理世界的必然之恶:你乘坐的火车可能刚刚进入隧道,如果方法说“是的,我已连接”,那实际上是一个谎言。

于 2012-06-20T13:19:45.750 回答