在做socket通信时,tcp连接,客户端拔掉网线,怎么获取这个状态,告诉用户通讯断开了?就像QQ在2秒内会掉线
本想用socket.send来获取,可socket在20秒才会捕获socketexception异常,这个值有没办法改变?20秒感觉太久了……
另外朋友们有没好的办法?

解决方案 »

  1.   

    没细研究过,看看TCPClient有没有相关属性什么的,检测方法应该就是抛异常了
      

  2.   

    Socket.SetSocketOption()方法,通过设置相应的参数,可以将一个Socket的底层通讯心跳设置一个值,比如1000毫秒。这样,当对方拔掉网线后,1秒过去了,底层心跳不能收到ACK,就会在Socket接收数据的地方抛异常。
    这时,只需要捕获异常就好了。
      

  3.   

    在线程中判断当前本地连接的状态。if(!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        return;//你要做的事儿
      

  4.   

    socket 连接突然断开 会报异常的
    你捕获异常
      

  5.   


    这个对的,如果不采用心跳包来检测的话,只有在再使用这个socket发数据时才能抛出异常,发现网线断开
      

  6.   


    我是在做客户端,也就是说自己的网络断开,拔掉网线只是1种情况,用这个方法可以吗?
    我刚才做测试,程序不能运行了,说set什么没返回
      

  7.   

    以前用vb的一个socket控件,是通过判断它的status来判断网络状况的。
      

  8.   

    还有没高见啊??
    等待ing……
      

  9.   

    socket 连接突然断开 会报异常的
    你捕获异常
      

  10.   

    tcp 是实时连接的吧。客户端断开 服务端直接就异常了
      

  11.   

    捕获异常,判断e.ErrorCode是不是为10054
      

  12.   

                        catch (SocketException e)
                        {
                            if (e.ErrorCode == 10054)
                            {
                                远程主机强迫关闭了一个现有连接
                            }
                        }
      

  13.   

    轮询
    DllImport("wininet.dll")]
            private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);
            public bool IsInternetConnected()
            {
                int i = 0;            return InternetGetConnectedState(out i, 0);
            }
    用ping
      

  14.   

    学习,正在用Socket,遗憾的是没有作异常判断正郁闷中
      

  15.   

    如果在客户端判断网络,一旦断电那就没用了
    如果在服务端ping,会涉及防火墙问题
    所以这个问题,最正规的做法就是客户端定期发送心跳包,服务端轮询检查 超时的释放socket连接
      

  16.   

    有没有哪位大侠对socket.incontrol()方法熟悉??今天看了一个高人讲的:
    由于在应用层进行判断存在各种困难,那么是否可以考虑使用TCP底层的一些特性呢?通过思考,我想到可以利用TCP底层协议的KeepAlive-Timer进行网络状态的判断过利用Socket类的IOControl()函数可以达到上述的目的:在C#中,其语法为: 
    public int IOControl ( IOControlCode ioControlCode, byte[] optionInValue, byte[] optionOutValue ) 
    其中主要参数的意义如下: 
        ioControlCode :一个 IOControlCode 值,它指定要执行的低级操作模式的控制代码。 
        optionInValue :Byte 类型的数组,包含操作要求的输入数据。 将IOControlCode的值设置为KeepAlive就可以得到对该操作的控制。对于inOptionValues的定义,可以通过查找Wsocket2的文档找到答案:它是一个如下的结构体:
    Struct tcp_keepalive
    {
    u_long onoff; //是否启用Keep-Alive
    u_long keepalivetime;  //多长时间后开始第一次探测(单位:毫秒)
    u_long keepaliveinterval; //探测时间间隔(单位:毫秒)
    }在C#中,将一个tcp_keepalive结构的内容按照顺序写入Byte数组中,然后传递给IOControl函数,我们就可以使用该函数来对网络状态进行准确的判断了。可感觉还是不是很懂,有没大侠讲讲??