试验一
试验过程:
1.Server仅投递唯一一个AcceptEx接收请求。
2.Client连接。
3.Server于连接完成回调中以Client Socket作为线程参数创建子线程,线程函数是Func。
4.Func:
将调用closesocket(s)关闭连接,在这个过程中Client无退出无closesocket(s)。
Func关闭连接前
关闭后,Func退出前
Func退出后
小结:
前提:无数据传输,无待决IO,Client自始至终无退出无closesocket(s)
操作:Server调用closesocket(s)关闭连接
结果:符合四步握手
试验二
试验过程:
与试验一相同,不同点:
在Server关闭连接前,与Client有数据往来。
结果:
与试验一相同
小结:
前提:有数据传输,无待决IO,Client自始至终无退出无closesocket(s)
操作:Server调用closesocket(s)关闭连接
结果:符合四步握手
试验三
前提:Server和Client连接正常,Server上存在待决IO(WSARecv)
操作:Server某个线程调用closesocket(s)关闭连接
结果:
待决IO立即返回
TCP连接状态(在Client未退出未关闭连接的情况下,TCP连接被粗暴关闭,直接跳过四步握手)
综上所述:
前提:Client未退出未关闭连接
操作:Server中某线程调用closesocket(s)关闭连接
结果:
若Server于Client Socket无待决IO(WSARecv),TCP连接儒雅关闭,呈Server—>Client单向关闭,符合四步分手;
若Server于Client Socket有待决IO(WSARecv),待决IO即刻以bRet = 0, dwNumTransfer = 0, ErrorCode = 1236返回。与此 同时TCP连接跳过四步分手被暴力强关。