DisconnectEx用法不解:只能用来主动关闭客户端连接?还是可以“客户端主动关闭连接”后DisconnectEx该客户端对应SOCKET
DisconnectEx用法疑惑:只能用来主动关闭客户端连接?还是可以“客户端主动关闭连接”后DisconnectEx该客户端对应SOCKET?
MSDN :
The DisconnectEx function closes a connection on a socket, and allows the socket handle to be reused.
这个意思是说DisconnectEx就是用来关闭连接的,然后让SOCKET复用。
但是我用代码测试发现:
客户端主动关闭连接 -> 服务端调用DisconnectEx(m_client_socket,...) -> 再AcceptEx(m_server_socket,m_client_socket,...) -> 成功!
客户端主动关闭连接 -> 服务端不调用DisconnectEx(m_client_socket,...) -> 再AcceptEx(m_server_socket,m_client_socket,...) -> 失败!
所以我想问问:难道客户端断开连接以后就必须closesocket(m_client_socket);吗?不能DisconnectEx(m_client_socket,...)吗?
我是这样想的:
一般来说,服务端不会主动关闭客户端连接的,假设有1万个客户端,每分钟就有2千个客户端会断开,同时每分钟有2千个客户端重新连接上来,那么这么多客户端断开连接时用DisconnectEx不是比closesocket要好吗,而且正常业务中也是这个样子的啊。
但是有大神级的程序员说DisconnectEx根本就不是这种用法,但又不告诉我原因,所以我非常迷惑,是哪儿有问题?还是DisconnectEx的确有深层的原因我不了解的。
请大家帮忙看看。我是个有强迫症的程序员。喜欢刨根就底!
------解决方案--------------------
有资料上说,sock关闭/创建是一个耗时的过程,因此,高性能应用一般复用socket
复用的方法有两种,一种是DisconnectEx,另一种是TransmitFile,都可以复用sock,无论哪一种,服务器端都必须主动调用这两个方法之一
用户端断开后,tcp/ip断开,但是socket应该没有断开
------解决方案--------------------
肯定得调用DisconnectEx,因为这样才能指定REUSE,一般情况下用DisconnectEx是要比closesocket好,closesocket的话那就没调用DisconnectEx的必要了。当然,DisconnectEx我使用的时候发现有极个别的时候不会返回IO的,这种情况得处理下
------解决方案--------------------
为了reused那个套节字,调用DisconnectEx是有意义的,因为客户端主动断开的也能在GetQueuedCompletionStatus中知道,通过判断调用DisconnectEx就行了,其实这里面有个问题是“connection on a socket”,如果已经断开了,那就可以不再做断开操作,但最后“allows the socket handle to be reused.”这个才是主要的
------解决方案--------------------
非常有必要
DisconnectEx的目的是REUSE;不管是主动关闭的,还是被动关闭的,都要用DisconnectEx来重用这个句柄。
closesocket目的是关闭,并释放资源,这时是不能重用的。
------解决方案--------------------
我也准备在boost asio中拿到Native 套接字句柄 然后DisConnectEx,这样就可以继续重用socket对象
不用每次new
MSDN :
The DisconnectEx function closes a connection on a socket, and allows the socket handle to be reused.
这个意思是说DisconnectEx就是用来关闭连接的,然后让SOCKET复用。
但是我用代码测试发现:
客户端主动关闭连接 -> 服务端调用DisconnectEx(m_client_socket,...) -> 再AcceptEx(m_server_socket,m_client_socket,...) -> 成功!
客户端主动关闭连接 -> 服务端不调用DisconnectEx(m_client_socket,...) -> 再AcceptEx(m_server_socket,m_client_socket,...) -> 失败!
所以我想问问:难道客户端断开连接以后就必须closesocket(m_client_socket);吗?不能DisconnectEx(m_client_socket,...)吗?
我是这样想的:
一般来说,服务端不会主动关闭客户端连接的,假设有1万个客户端,每分钟就有2千个客户端会断开,同时每分钟有2千个客户端重新连接上来,那么这么多客户端断开连接时用DisconnectEx不是比closesocket要好吗,而且正常业务中也是这个样子的啊。
但是有大神级的程序员说DisconnectEx根本就不是这种用法,但又不告诉我原因,所以我非常迷惑,是哪儿有问题?还是DisconnectEx的确有深层的原因我不了解的。
请大家帮忙看看。我是个有强迫症的程序员。喜欢刨根就底!
------解决方案--------------------
有资料上说,sock关闭/创建是一个耗时的过程,因此,高性能应用一般复用socket
复用的方法有两种,一种是DisconnectEx,另一种是TransmitFile,都可以复用sock,无论哪一种,服务器端都必须主动调用这两个方法之一
用户端断开后,tcp/ip断开,但是socket应该没有断开
------解决方案--------------------
肯定得调用DisconnectEx,因为这样才能指定REUSE,一般情况下用DisconnectEx是要比closesocket好,closesocket的话那就没调用DisconnectEx的必要了。当然,DisconnectEx我使用的时候发现有极个别的时候不会返回IO的,这种情况得处理下
------解决方案--------------------
为了reused那个套节字,调用DisconnectEx是有意义的,因为客户端主动断开的也能在GetQueuedCompletionStatus中知道,通过判断调用DisconnectEx就行了,其实这里面有个问题是“connection on a socket”,如果已经断开了,那就可以不再做断开操作,但最后“allows the socket handle to be reused.”这个才是主要的
------解决方案--------------------
非常有必要
DisconnectEx的目的是REUSE;不管是主动关闭的,还是被动关闭的,都要用DisconnectEx来重用这个句柄。
closesocket目的是关闭,并释放资源,这时是不能重用的。
------解决方案--------------------
我也准备在boost asio中拿到Native 套接字句柄 然后DisConnectEx,这样就可以继续重用socket对象
不用每次new