(100分)如何设置完成端口为温柔关闭?(graceful close)

时间:2022-09-24 19:11:07
TCP连接,服务端用完成端口模型,客户端用无堵塞SOCKET,互相连接。当服务端给CLIENT发送一条数据后,就马上主动断掉(closesocket)和CLIENT的连接,理论上由于是TCP连接,CLIENT应该还是会收到到SERVER发送的最后一条数据后才真正断线,但是完成端口closesocket后,CLIENT不能保证能收到最后那些数据了。
    而我把SERVER端换成SELECT模型,就是正常的。但是完成端口模型偏偏就不是,在完成端口模型里,我使用的是WSAAccept和WSASend等异步函数,而select模型里使用的传统函数。
    我尝试使用了setsockopt设置SO_LINGER也没有起到作用。请高手指点。

7 个解决方案

#1


找到方法了,closesocket前需调用shutdown

#2


smart brain

#3


解决了就好 ^_^
jf

#4


呵呵

#5


shutdown里的参数用什么

#6


不会吧?你是怎么closesocket的,用close吗?

int ret = shutdown( iSock, 2 );
int ret = close(iSock);
上面两条语句是等效的。

#7


用 shutdown 实现半关闭,然后延迟一段时间再 closesocket

#1


找到方法了,closesocket前需调用shutdown

#2


smart brain

#3


解决了就好 ^_^
jf

#4


呵呵

#5


shutdown里的参数用什么

#6


不会吧?你是怎么closesocket的,用close吗?

int ret = shutdown( iSock, 2 );
int ret = close(iSock);
上面两条语句是等效的。

#7


用 shutdown 实现半关闭,然后延迟一段时间再 closesocket