首页 > 解决方案 > 使用 IOCP 的优雅套接字关闭

问题描述

我编写了一个 C++ 应用程序,它可以根据命令行参数充当服务器和客户端。因此,客户端将启动一个连接,服务器将接受并进行数据传输,并且我将始终有一个具有 2KB 缓冲区的未决 WSARecv 调用。到这里为止还好。

但是假设我在客户端调用shutdown和closesocket,然后GetQueuedCompletionStatus在客户端失败并出现错误ERROR_CONNECTION_ABORTED(0x40),在服务器端失败并出现错误ERROR_NETNAME_DELETED(0x64)。

这是关闭套接字的代码

   shutdown(sock, SD_RECEIVE);
   closesocket(sock);

但是可以说,我从 Postman 应用程序向服务器发送了一个请求,我注意到当 Postman 收到来自服务器的响应时它关闭了套接字,并且 GetQueuedCompletionStatus 没有失败并且我得到一个 IO 完成数据包,其中 lpNumberOfBytesTransferred 为零。

这种行为改变的原因是什么?我是否优雅地关闭了套接字?

同样在wireshark中,我注意到当我的客户端关闭套接字时,我看到了一个RST数据包,而邮递员发送了一个FIN数据包。我究竟做错了什么?

标签: c++socketswinsock2iocp

解决方案


推荐阅读