首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从I/O完成端口移除句柄和有关IOCP的其他问题

从I/O完成端口移除句柄和有关IOCP的其他问题
EN

Stack Overflow用户
提问于 2011-07-04 15:09:14
回答 4查看 6.9K关注 0票数 9

CreateIoCompletionPort函数允许创建新的I/O完成端口和注册现有I/O完成端口的文件句柄。

然后,我可以使用任何函数,比如套接字上的recv或带有OVERLAPPED结构的文件上的ReadFile来启动异步操作。

我必须检查函数调用是否同步返回,尽管它是用OVERLAPPED结构调用的,并且在本例中直接处理它。在另一种情况下,当ERROR_IO_PENDING被返回时,我可以使用GetQueuedCompletionStatus函数在操作完成时得到通知。

出现的问题是:

  • 如何从I/O完成端口移除句柄?例如,当我向IOCP中添加套接字时,如何删除关闭的套接字?我应该用相同的完成键重新注册另一个套接字吗?
  • 另外,是否有一种方法可以使调用始终通过I/O完成端口,而不同步返回?
  • 最后,是否可以例如异步地使用recv,但是可以同步地使用send?例如,当实现一个简单的回显服务时:我可以与异步recv一起等待新的数据,但以同步的方式send响应,从而降低代码复杂度吗?在我的例子中,我不会在第一个请求被处理之前第二次recv
  • 如果异步ReadFile已经被请求,但是在它完成之前,应该处理同一个文件的WriteFile,会发生什么?当写入完成后,ReadFile是否会被取消,并且我必须重新启动读取进程?或者在编写之前我必须手动取消ReadFile吗?这个问题是与通信设备一起产生的,因此,如果同时发生,写和读不应该做问题。
EN

Stack Overflow用户

发布于 2011-07-05 13:28:31

如何从I/O完成端口移除句柄?例如,当我向IOCP中添加套接字时,如何删除关闭的套接字?我应该用相同的完成键重新注册另一个套接字吗?

你把它搞错了。您将I/O完成端口设置为文件对象使用--当文件对象被删除时,您没有什么可担心的。您之所以感到困惑,是因为Win32公开底层本地API功能的方式(CreateIoCompletionPort在一个函数中做两件非常不同的事情)。

另外,是否有一种方法可以使调用始终通过I/O完成端口,而不同步返回?

一直都是这样的。只有从Windows开始,才能自定义完成通知的处理方式。

如果异步ReadFile已经被请求,但是在它完成之前,应该处理同一个文件的WriteFile,会发生什么?当写入完成后,ReadFile是否会被取消,并且我必须重新启动读取进程?

Windows中的I/O操作本质上是异步的,请求总是排队。您可能不认为这是因为您必须在FILE_FLAG_OVERLAPPED中指定CreateFile才能打开异步I/O。然而,在本机层,同步I/O实际上是一个附加的、方便的东西,内核跟踪文件位置,等待I/O在返回之前完成。

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6573218

复制
相关文章

相似问题

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