有资料上说,sock关闭/创建是一个耗时的过程,因此,高性能应用一般复用socket
复用的方法有两种,一种是DisconnectEx,另一种是TransmitFile,都可以复用sock,无论哪一种,服务器端都必须主动调用这两个方法之一用户端断开后,tcp/ip断开,但是socket应该没有断开

解决方案 »

  1.   

    肯定得调用DisconnectEx,因为这样才能指定REUSE,一般情况下用DisconnectEx是要比closesocket好,closesocket的话那就没调用DisconnectEx的必要了。当然,DisconnectEx我使用的时候发现有极个别的时候不会返回IO的,这种情况得处理下
      

  2.   

    可能我表达不完善,没有把重点表达出来。我想表达的是:MSDN上写着:The DisconnectEx function closes a connection on a socket, and allows the socket handle to be reused.意思是DisconnectEx只能用来主动关闭SOCKET,比如服务端主动断开某个客户端的连接,此时用DisconnectEx而客户端主动断开和服务端的连接时,服务端需要释放资源,这就不是“断开连接”了,这时用DisconnectEx有意义没有?
      

  3.   

    为了reused那个套节字,调用DisconnectEx是有意义的,因为客户端主动断开的也能在GetQueuedCompletionStatus中知道,通过判断调用DisconnectEx就行了,其实这里面有个问题是“connection on a socket”,如果已经断开了,那就可以不再做断开操作,但最后“allows the socket handle to be reused.”这个才是主要的
      

  4.   

    非常有必要
    DisconnectEx的目的是REUSE;不管是主动关闭的,还是被动关闭的,都要用DisconnectEx来重用这个句柄。
    closesocket目的是关闭,并释放资源,这时是不能重用的。
      

  5.   

    我也准备在boost asio中拿到Native 套接字句柄  然后DisConnectEx,这样就可以继续重用socket对象
    不用每次new
      

  6.   

    谢谢关注,测试很久,基本可以确定DisconnectEx适用于服务端主动断开和客户端主动断开的,但我发现有一个细节点要注意:在IOCP通信模式中,如果客户端主动断开,然后调用DisconnectEx成功,然后DisconnectEx的SOCKET被用于下一次ACCEPTEX,ACCEPTEX成功之后该SOCKET要和完成端口绑定,此时绑定会失败,返回87错误,但是实际上已经绑定成功了,可以成功的投递SEND和RECV事件,好像是调用DisconnectEx(socket,...)并没有将socket和完成端口解除绑定,下一次再绑定就会失败,变成重复绑定了。