CreateIoCompletionPort
函数允许创建新的I/O完成端口和注册现有I/O完成端口的文件句柄。
然后,我可以使用任何函数,比如套接字上的recv
或带有OVERLAPPED
结构的文件上的ReadFile
来启动异步操作。
我必须检查函数调用是否同步返回,尽管它是用OVERLAPPED
结构调用的,并且在本例中直接处理它。在另一种情况下,当ERROR_IO_PENDING
被返回时,我可以使用GetQueuedCompletionStatus
函数在操作完成时得到通知。
出现的问题是:
recv
,但是可以同步地使用send
?例如,当实现一个简单的回显服务时:我可以与异步recv
一起等待新的数据,但以同步的方式send
响应,从而降低代码复杂度吗?在我的例子中,我不会在第一个请求被处理之前第二次recv
。ReadFile
已经被请求,但是在它完成之前,应该处理同一个文件的WriteFile
,会发生什么?当写入完成后,ReadFile
是否会被取消,并且我必须重新启动读取进程?或者在编写之前我必须手动取消ReadFile
吗?这个问题是与通信设备一起产生的,因此,如果同时发生,写和读不应该做问题。发布于 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在返回之前完成。
https://stackoverflow.com/questions/6573218
复制相似问题