如果我把客户断的网线拔掉,
服务器端如何知道客户端已经断开了?请各位高手们给个想法,
有想过有心跳包的方式,但是不知道怎么做、
能不能给个参考的代码?
也有试过直接调用sendTimeOut和receiveTimeOut
但是好像都没用处!急,不懂的也帮我顶一顶,凡顶者皆有5分。
回答者依据帮助情况给分!谢谢啦!
送完为止

解决方案 »

  1.   

    你所说的要检测出网线断开的情况,归根结底,就是物理链路的检测问题在.Net中实现心跳包邮两种方法
    1.自己用Socket写心跳包,自己写比较繁琐,复杂,容易出错,不建议
    2.其实.Net的Socekt本身就提供了KeepAlive,利用Socket.IoControl函数设置KeepAlive,可以实现心跳包,详细的方法可以参考这篇文章http://blog.csdn.net/wzd24/archive/2007/10/12/1821360.aspx,这是我建议的方法我最近也在做一个TCP相关的项目,利用第二种方法很好的解决了心跳包的问题有兴趣的可以邮件相互讨论 [email protected]
      

  2.   

    socket.Receive()函数返回0代表对方断开。
    p2p需要打洞,但好像不是所有的路由器都支持tcp吧,我记得以前看过一本书说是只有70%支持。
    应该用udp吧
      

  3.   

    facky904:你提供的邮件地址是无效的!
    有其他邮件地址没?
      

  4.   

    客户端发送数据在指定时间内超时,指定时间是多少,这个概念很模糊?
    什么时候网络有可能出现阻塞,也认为客户端已经断开连接吗?
    而且我的底层,也就是所谓的客户端其实就是一块电路板的芯片在处理!不是软件~实现起来也挺麻烦!再者我用的是P2PSocket通信,总感觉这东西用起来特别麻烦。
    一点都不熟悉这么个P2PSocket通信,哎当初网络这部分就不应该交给其他人做,现在很费劲!但是又不想重新做~
      

  5.   

    心跳就是 格一段时间  调用服务器 ClientOnLine 接口  服务器 更新客户端最后联系时间并且清除超过多少时间  未联系的客户端id
      

  6.   

    服务端可以先把客户端socket保存起来啊,然后定时向客户端发信息。如何一定时间客户端没有响应说明客户端断开咯啊!
      

  7.   

    facky904 18小时前 回复
    我自己的做法是这样的,这是我自己写的函数
    /// <summary>
            /// KeepAlive心跳包
            /// </summary>
            /// <param name="sock"></param>
            /// <param name="onOff">开启关闭检测,1开启,0关闭</param>
            /// <param name="keepALiveDelay">检测前的等待时间</param>
            /// <param name="keepALiveInterval">检测的时间间隔</param>
            public void KeepAlive_Timer(Socket sock, int onOff, int keepALiveDelay, int keepALiveInterval)
            {
                try
                {
                    uint dummy = 0;
                    byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
                    BitConverter.GetBytes((uint)onOff).CopyTo(inOptionValues, 0);
                    BitConverter.GetBytes((uint)keepALiveDelay).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
                    BitConverter.GetBytes((uint)keepALiveInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
                    sock.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
                }
                catch (Exception err)
                {
                    throw new Exception(err.Message);
                }        }对于服务器端的Socket,在每次Accept到一个接入的Socket时,要对该Socket设置一次
    我用的是异步的Accept,在回调函数里面设置Socket的KeepAlive
    列:
    private void OnConnectRequest(IAsyncResult ar)
            {
                
                Socket listener = (Socket)ar.AsyncState;
                Socket client = new Socket(listener.EndAccept(ar), this);
                KeepAlive(client,1, 15000, 5000);
                //其他代码
               listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
    }
      

  8.   

    就快有点头绪了~感谢facky904,以及在座各位的鼎力相助!