大家好啊,以前没用过vb 最近工作需要,请问两个问题:1 那个winsock控件为什么我用close方法主动关闭socket不会触发close事件呢,因为我需要在这个事件里面做一些处理,我应该怎么做?因为我现在做的是一个心跳检测即定时去关闭长时间没有发来心跳的客户连接,但它不会触发close事件让我无法去处理当前的连接数,因为我是在客户socket数组的close事件中去对当前连接总数减一的(这样我才知道是成功关闭了)2 我现在采用的是用一个sockListenner控件作监听,当它接收到连接请求后用另一个控件数组sockClient去接受(Accept)它(下标从零开始的),当关闭了下标为零的socket(即第一个socket),每次连接都会触发一个索引为零的socket的Close事件,这又是怎么回事呢?是不是能用下标为0的sockClient的元素去接收连接啊?
非常紧急,非常希望你们的帮助

解决方案 »

  1.   

    分给的太少了吧?我倒是用 Winsock 做过很多东西了,但你问的问题我也需要简单查一下资料,分儿少了,就不想差了,还是等知道的人顺便回答你的问题吧对不起了,我实在抱歉!
      

  2.   

    1、close事件是由远程主机触发的,来自于scoket消息,而close方法,是本地调用,它会让远程主机发生Close事件,当然它不会触发本地消息。
    2、Accept时,不要关闭用于侦听的scoket。应该Load一个新Scoket,最好也不要用什么新控件数组,当前数组ubound+1即可,这样便于管理。
      

  3.   

    定时sendData给远端,如果远端已关闭,则sendData会出错,在Error事件中就可以处理了。这样可以检测出远端非正常关闭winsock(不触发close事件)时,保证把实际已断开的连接在interval时间内清除。
      

  4.   

    close事件触发是这样的,客户端如果关闭程序,那么过一会服务端才会触发,如果客户端的程序被错误关掉(比如:通过任务管理器关闭进程,或者客户端关机等非正常关闭,那么一会后服务端就会触发Error事件,所以在服务端得处理close 、Error这两个事件。。不知道我说的对不对,不对请指出,谢谢啊
      

  5.   

    第一个问题没看懂什么意思?对于第二个问题,我最近用过winsocket的数组来接受客户端的连接请求,非0下标的winsocket是可以接受的。我是用第0个winsocket控件来监听,而从第1个开始接受客户端的请求。你的也应该可以。
      

  6.   

    之所以你的每次都是从第0个开始来接受,原因是:你不是说了嘛,第0个winsocket控件被你关闭了,所以就从第0个开始接受连接请求了。
      

  7.   

    我也需要这个问题的答案。
    但我觉得,你用close关闭,没有诱发close事件,这是肯定的,但你可以自已添加这个调用呀。
      

  8.   

    如果客户端关闭了,它的state会由7变成0,服务端也会同时发生wskServer_close()事件,但是它的state则会由7变为8,它必须close以后重新进行监听,等待客户端的再次连接。 如果想知道客户端是否 下线呢??建议客户端设计时,每隔固定时间间隔向服务器发送一个hello包,如果服务在超过时间间隔后 没有受到hello包,则可以说明客户端连接有问题. 
      

  9.   


    对不起,实在报歉,开个玩笑!没有那个意思,其实楼主提的这个问题相当好,让我也学习了,感谢楼主!
    其实对于真正的高手来说,分是不重要的,重要是问题具有挑战性,你这个问题就不错!(码林高手们都爱挑战,就像武侠小说中的独孤求败一样好挑战,这里先且说是码林高手吧,写代码的嘛,呵呵!)2楼对你的问题1说的很有道理,MSDN里也是这么说的!你的2问题有点让人看不明白,不太好理解,要不如果可以你能否把代码贴出一部份,大家共同看看呢?最后再次感谢楼主出这个题目!