对我一直困扰的这个问题,请问如何处理。如果客户端是正常的关闭的,他势必会触发服务器端的winsock的close事件。但是如果他是我说的那两种情况(断电或者拔掉上网线),则不会触发这两个情况。而且我也试图用过winsock.State属性去判断过了,但是还是不行。在服务器端的值会永远保持等于7的,请问各位前辈,是否碰到过我这样的烦恼,该如何处理?

解决方案 »

  1.   

    在服务端程序内,设定一个Timer,比如5秒。每5秒向所有连接着 的客户端发送检查信息。如果发送后,客户端没有发回报信息,那就是说明已经断线了。
      

  2.   

    谢谢2楼的,
    我以前处理的思路就是这样的。
    但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
    而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问题了吧。
    所以是否有更好的,成熟的对于VB中编写winsock服务器端的方法?
      

  3.   


    哦。我以前写的就是这样子的方式。连接了大约80多台客户机器。
    我的思路就是:每隔5秒,服务器向所有客户端IP发送信息。(用 For Loop 来循徊所有连接的IP)
    当发送到客户端 X 的时候失败了,就当作对方连接失败了。可以严格来说,没有监测错误的说。
    虽然不知道你的情况怎么样,不过希望对你有帮助。
      

  4.   


    我这里试过,如果客户端关闭掉,服务器还是相连接的情况下,在服务器端调用winsock.SendData "Hello" 函数不会马上出错的,大约过1分钟左右,winsock 才会触发error事件。这个时候才知道那个客户端出错了。甚至我再次做试验的时候,碰到了这种方法下,过了很长的时间,winsock 也不会触发error事件! 所以无法知道客户端一定出问题了。
    你能说的在具体点吗。
    我把我写的代码说一下:客户端通过tcp协议连接了服务器端的winsock
    然后我就把客户端的上网线拔掉。根据你说的思路就是要在服务器端上放1个时钟控件,然后我是每秒钟都调用
    winsock.SendData "Hello" 给客户端。但是当拔掉上网线后,调用这个函数也不会出错,它很正常的在用。
      

  5.   


    我想问这种方法是否就是所谓的 “一般通讯系统都采用定时发心跳包的方法”,这两个方法是不是同一个事情。就是要求客户端每隔多少时间(比如5秒)通过调用SendData 函数来发送消息到服务器端。在服务器端判断,如果30秒以内没有收到就算断线?
      

  6.   

    心跳包
    http://zhidao.baidu.com/question/32992581.html
      

  7.   


    你用的是TCP吗?
    我用的是比较冷门的UDP。所以不会出现你说的问题。
      

  8.   


    原来是这么回事
    那请问,大部分的这类通讯系统都是用UDP包的啊?
      

  9.   


    很多人都选择TCP Protocol,不过我就喜欢UDP。
    我写过网吧计时收银钱的软件,为学校写过锁荧幕的软件,全都是UDP方式来写的。
    可以说侦测客户机器断线或在线几乎都没有出错。
      

  10.   

    好的,十分感谢!
    我是用tcp协议的,可能得要换一个协议用用。
    你认为VB做的这样的通讯的服务器程序,能够承载200个客户端的连接吗?
    我是用winsock控件数组的,你是吗?
      

  11.   


    我用Winsock控件(vb6 enterprise 版本),采用UDP连接了最多80多台没有出错过。
    至于你的大型200多台,我就不知道了。
      

  12.   

    udp本来就是无连接不可靠的,那还掉啥线阿~  没线可掉啊
      

  13.   

    9楼连接里说的很清楚呀。你有服务器端吧?服务器端检测每个连接在N分钟之内没有SEND过来,就是离线呀。而客户端每M分钟要发个包过去。这个N和M你自己调整好。根据网络情况,把延迟打进去。一般5分钟就可以了吧。