c++ - 使用 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数据包。我究竟做错了什么?
解决方案
推荐阅读
- amazon-web-services - 如何使用客户端 golang 在 cloudwatch 中拉/推指标
- php - Symfony 如何/在哪里评论
我试图允许通过Symfony 5.0.8的
<?php
标签在论坛上使用标签。code
不知何故 Symfony(或 Twig,我不能在这里说)神奇地把它放在评论之间,我真的不知道在哪里、如何以及为什么这样做。
raw
显然,我正在通过过滤器在我的树枝模板中传输- augmented-reality - 如何使用 AR.js 在图像上渲染视频,使其保持完美的轨道和正确的大小?
- python - 当 python 脚本从 crontab 运行时,__name__ 会是什么?
- python - 如何在 tkinter 中将多个项目从一个列表框移动到另一个列表框?
- r - ggplot - geom_histogram - 边界在做什么
- c# - 如何在 C# 中为 Perceptron 训练多个输入?
- python - 机器学习和感知器
- css - 弹性物品不“伸展”
- swiftui - SwiftUI 中的强制方向