该CreateIoCompletionPort
函数允许创建新的 I/O 完成端口并将文件句柄注册到现有的 I/O 完成端口。
然后,我可以使用任何函数,例如recv
套接字上的 a 或ReadFile
具有结构的文件上的 aOVERLAPPED
来启动异步操作。
我必须检查函数调用是否同步返回,尽管它是用OVERLAPPED
结构调用的,在这种情况下直接处理它。在另一种情况下,当ERROR_IO_PENDING
返回时,我可以使用该GetQueuedCompletionStatus
函数在操作完成时得到通知。
出现的问题是:
如何从 I/O 完成端口移除句柄?例如,当我向 IOCP 添加套接字时,如何删除已关闭的套接字?我应该用相同的完成键重新注册另一个套接字吗?
另外,有没有办法让调用总是通过 I/O 完成端口并且不同步返回?
最后,是否有可能例如
recv
异步但send
同步?例如,当实现一个简单的回显服务时:我可以异步等待recv
新数据,但send
以同步方式响应,从而降低代码复杂性吗?recv
就我而言,在处理第一个请求之前,我不会再做第二次了。如果
ReadFile
已请求异步,但在完成之前,WriteFile
应处理同一文件的 a,会发生什么情况。是否会因ReadFile
错误消息而取消,并且我必须在写入完成后立即重新启动读取过程?还是我必须ReadFile
在写之前手动取消?这个问题与通信设备结合出现;因此,如果同时发生,写入和读取不应该有问题。