首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >closesocket()未完成IOCP的待定操作

closesocket()未完成IOCP的待定操作
EN

Stack Overflow用户
提问于 2017-10-12 06:44:22
回答 1查看 832关注 0票数 0

我目前正在C++中开发一个服务器应用程序。我的主要灵感来自以下例子:

Windows SDK IOCP Excample

I/O完成端口IPv6 4/IPv6 6服务器程序实例

我的应用程序非常类似于这些程序(socketobj,packageobj,.)。

总的来说,我的应用程序运行时没有问题。唯一给我带来麻烦的是半开放的联系。

我的策略是:在一段时间内检查每个连接的客户端,并计算一个“空闲计数器”。如果出现一个完成,我会重置这个计时器。如果空闲计数器太高,则设置一个布尔值以防止其他线程提交操作,然后调用closesocket()

我的假设是,现在套接字已经关闭,挂起的操作将完成(可能不是立即,而是过了一段时间)。这也是MSDN文档描述的行为(提示,第二段)。我需要这样做,因为只有在所有操作完成之后,我才能释放资源。

长话短说:对我来说不是这样。我用testclient应用程序和cout和断点调试做了一些测试,发现关闭套接字的挂起操作还没有完成(即使在等待10分钟之后)。我还在shutdown()之前尝试过使用closesocket()调用,两者都没有返回错误。

我做错了什么?这发生在其他人身上吗?MSDN文档错误吗?有什么可供选择的?

我目前正在考虑“逗留”功能,或者使用CancelIoEx()函数显式取消每个操作。

编辑:(感谢您的回复)

昨天晚上,我为每个sockedobj添加了一个链表,以保存挂起的操作的per obj。有了这个,我尝试了CancelIOEx()函数。函数返回0,GetLastError()返回大多数操作的GetLastError()

那么,在这种情况下,仅仅释放是安全的吗?

我还发现,当我在同一台机器上运行服务器应用程序和客户端应用程序时,这种情况会发生得更频繁。服务器有时无法完成写操作,这种情况时有发生。我认为发生这种情况是因为客户端接收缓冲区已满。(客户端不会停止接收数据!)。

下面是代码片段,请尽快执行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 07:00:09

  • “逗留”设置可以用来重置连接,但这样会(a)丢失数据,(b)将重置传递给对等方,这可能会吓到它。
  • 如果你正在考虑一个积极的停留超时,这并不是真正的帮助。
  • read的关机应该会终止读操作,但是对于写的关机只在挂起写之后才会排队,所以根本没有帮助。
  • 如果挂起的写入是问题,而未完成,则必须取消它们。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46703070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档