续上一个帖子:http://topic.csdn.net/u/20110312/00/c3863401-5100-4129-a838-17bb2312b869.html实践证明重用SOCKET是可以实现的,当服务端主动关闭套接字的时候此SOCKET可以重用(完全的4次握手)可从客户端关闭的时候,服务端的SOCKET总是处于CLOSE_WAIT状态,导致下一次AcceptEx失败.网上有资料说设置LINGER可以缩短CLOSE_WAIT的时间,但是对于异步好像是无效的.我是用的TELNET做测试,连接之后直接X掉,服务端出现CLOSE_WAIT状态,客户端(实际上进程已退出)出现WAIT_FIN_2状态.请问大家有什么方法可以解决这个问题,包括写驱动也可以.

解决方案 »

  1.   

    你的重用的意思是,客户端关闭,服务器那边不把socket close 就继续用?
    但我觉得这样不好吧?不太懂,来学习。
      

  2.   

    是的,不用closesocket,断开之后继续用,在研究这方面.
      

  3.   

    创建线程和关闭线程的开销大,于是有了线程池,
    您的socket迟,如果能实现,原理也应该和线程池类似吧,
    现在有些疑义的地方在于,创建socket的开销大吗?
    并不是所有的对象用池来管理是好的,线程池也有适用场景。如果管理的开销 远远大于了socket的创建开销,那就没必要了。
      

  4.   

    创建socket也是个大开销的。。某种意义上说
      

  5.   

    http://www.hacknp.cn/
    这里面有一个“AsyncSelect模型QQ程序教程区 ”栏目
      

  6.   

    要VIP才能访问.回3楼的朋友,SOCKET也是一种内核对象,创建和销毁的开销都不小,还要进行特权级的切换
    只是现在的电脑配置很高,低配置的就能感觉得到.
      

  7.   

    LINGER可能导致closesocket后线程等待,也可能是直接被RST掉
    如果你想快,就设置l_onoff=1;l_linger=0
      

  8.   

    close_wait状态 重新主动打开那个端口会失败
    不过来自客户端的连接是会成功的
    不信你试试.
      

  9.   

    看过一些资料,好像tx的socket就是重用的,因为会经历几个过程:比如密码验证,登录……每个过程都会建立新的连接,为了确保服务器的高效率,它会采用你说的这种做法,重复性创建socket会浪费很多资源的
      

  10.   

    调用DisconnectEx函数关闭链路,不要用closesocket
      

  11.   

    就是不是closesocket,一个SOCKET反复用而已
      

  12.   

    Acceptex与Disconnectex 配对使用,可以达到服务器端Socket重用
    Connectex与Disconnectex 配对使用,在被动关闭的情况下,可以达到客户端Socket重用
      

  13.   

    http://blog.sina.com.cn/s/blog_759803690101a7ul.html
    这个里面对socket池有比较清晰的解释