无法获得Socket.Poll和Socket.Connected按需工作

时间:2012-03-10 17:15:51

标签: c# sockets

好的,我知道这里有很多信息,我保证你已经阅读了所有内容并尝试了不同的方法来实现这一目标!

我有一个在笔记本电脑上运行的套接字服务器程序。然后我有多达50台笔记本电脑通过同一个LAN无线连接到服务器。客户端笔记本电脑都连接到服务器(使用Socket.ConnectAsync),服务器也使用异步方法发送和接收数据。服务器向用户显示已连接的客户端笔记本电脑列表,此列表似乎准确无误,并在客户端断开连接时启动。但是,客户端笔记本电脑在某些情况下似乎永远不会检测到与服务器的连接是否丢失(即,如果服务器程序崩溃,如果服务器笔记本电脑进入待机模式等)我在客户端笔记本电脑上有一个计时器,它会轮询每5秒连接一次如下:

     bool SocketConnected(Socket s)
    {             
        bool part1 = s.Poll(0, SelectMode.SelectWrite);

        bool part2 = (s.Available == 0);
        if (!part1 && part2)
        {

            return false;
        }
        else
        {
            return true;
        }
    }

我已尝试使用所有选择模式(SelectWrite,SelectRead,SelectError)并尝试使用不同的超时值。我已经尝试在这些操作后检查s.Connected值,并尝试了其他方法的所有方式来确定连接状态,似乎没有任何东西产生可靠的结果!我想我可以通过每隔5秒发送一次虚拟信息并检查s来实现我想要的结果。这样做之后连接,但我真的不想这样做,因为每台笔记本电脑已经向服务器发送了大量数据,因为它是。任何帮助都非常感谢!感谢

2 个答案:

答案 0 :(得分:2)

检查连接是否存活的唯一可靠方法是向另一端发送内容并查看它是否到达。您可以通过不时发送和接收“ping”值手动执行此操作,也可以通过启用KeepAlive socket option自动执行此操作。

答案 1 :(得分:1)

Socket.Poll的MSDN文档非常明确地提到了您提到的确切情况(服务器崩溃,待机):

  

此方法无法检测某些类型的连接问题,例如   作为断开的网络电缆,或远程主机已关闭   笨拙地。您必须尝试发送或接收数据以检测这些数据   各种错误。