为了减轻服务器的压力
小弟设想,在给客户发送消息之后,就主动断开这个连接
发现用closesocket却断不开
请大家帮帮忙~谢谢

解决方案 »

  1.   

    Try shutdown(s, SD_SEND),and then closesocket(s).
      

  2.   

    断不开?是调用closesocket出错?还是你压根儿就没有处理,还是客户端会主动重连?我所有的连接都是主动断开的,特别是采有长时间无数据即断开的策略,三秒钟不发数据就认为它断开,然后就是closesocket。一万个连接也只要几秒钟(列表同步产生线程操作临界区碰撞消耗时间)。
      

  3.   

    最近没事,跟在unsigned后面学习几天
      

  4.   

    to unsigned:1、closesocket是断不开的,网上也有相关文章,我尝试了下,正如文章所说
    2、客户端不会主动重连,因为,测试用的客户端,是我为了方便测试而写的
    3、请告诉我你的处理方法?谢谢
      

  5.   

    1.断开可以用netstat看看状态是什么,只听说过一种情况,当使用acceptex时,没有调用SO_UPDATE_ACCEPT_CONTEXT,无法关闭新的socket。但是具体会出现什么状态没有做过测试。
      

  6.   

    刚才测试了一下,估计将SO_UPDATE_ACCEPT_CONTEXT去掉,照样可以正常工作,服务器端强行closesocket并没有象楼主说的无法断开。我所使用的前面说的情况,即判断一定时间内客户端无消息交互即断开,测试时使用的是telnet,但是连上之后不发任何消息,然后一小段时间之后就被服务端主动断开了。
      

  7.   

    如果是有xxx_wait状态,那么就不应该是iocp主动断开的问题。
      

  8.   

    1、我没有用acceptex,应该就不会有SO_UPDATE_ACCEPT_CONTEXT的问题吧
    2、在服务端使用closesocket后,用服务端自己的查看当前连接客户端的功能,还是可以看到此客户端连接,如果客户端里面主动断开就不会出现这种情况
      

  9.   

    在服务端使用closesocket后,用服务端自己的查看当前连接客户端的功能,还是可以看到此客户端连接,如果客户端里面主动断开就不会出现这种情况
    ==========================
    这个没有断开,很有可能只是你的服务处理逻辑上面的问题。建议使用netstat -na -o查看相关连接内容,如果netstat 看不到相关的连接信息,那就可以完完全全确定是服务器处理逻辑上面的问题。建议,如果代码量不大的话,可以把 GetQueuedCompletedStats那一段线程代码(包括如何处理断开,这个比较关键)发上来让大伙帮你分析一下问题。
      

  10.   

    netstat   -na   -o查看
    服务器状态是FIN_WAIT_2
    客户端状态是CLOSE_WAIT这样算是正常么?
      

  11.   

    不正常,昨天我们就有一台服务器出现类似的问题。如果方便的话,可以把两端的代码发到我邮箱,我们正想重现类似的问题,谢谢。[[email protected]]僵哥[/email]
      

  12.   

    昏倒,邮件地址打错了[[email protected]]僵哥[/email]。
      

  13.   

       断开连接的时候:     active close一方:发送 FIN M后进入 FIN_WAIT_1 状态,收到ACK M+1后
    进入FIN_WAIT_2状态,再收到FIN N后,发送ACK N+1,进入TIME_WAIT 状态(马
    上详细讲这个TIME_WAIT)。     passive close一方:收到FIN M,发送ACK M+1,进入CLOSE_WAIT状态,当
    应用程序调用了close后,发送FIN N,进入LAST_ACK状态,收到最后一个ACK
    N+1后,回到CLOSED状态。 
      

  14.   

    不好意思,服务器已经应用于商业
    今天番看代码的时候,觉得加上主动断开比较好
    已经找到原因了,谢谢大家
    关闭的时候设置下这个就可以了,至少在我这是这样的,仅供大家参考lingerStruct.l_onoff = 1;
    lingerStruct.l_linger = 0;
    setsockopt( pContext->m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) );
      

  15.   

    关闭的状态信息,大部分都知道,关键点在于程序代码当中的实现。我们客户那里出现问题的程序,一方是我们的应用程序(相当于客户端),另一端是第三方的程序。到最后的结果,正好跟楼主的状况反一方向,也就是客户端是FIN_WAIT_2,而第三方的服务器是CLOSE_WAIT,我们也怀疑是第三方的程序存在问题,即当我们调用shutdown之后,对端收到可读(数据长度为0,即关闭信号),没有调用closesocket)。但是仅那一家客户,仅昨天出现过。