IO完成端口和套接字send()函数

3
根据我对IOCP的理解,当我创建完成端口并将套接字与其关联时,当套接字可以被读取时,将向完成端口发送通知。
但是,对于如何处理send(),也就是说,如果我想发送数据,我应该只调用send()吗?那关于完成端口,它是否会收到有关send()的任何通知呢?

2
使用IOCP,通常使用重叠I/O与WSASend/WASRecv一起排队I/O请求。使用send()不利用IOCP并且不能初始化重叠I/O请求。 - Martin James
1个回答

6
根据我对IOCP的了解,当我创建一个完成端口并将套接字与之关联时,当套接字准备好读取时,将向完成端口发送通知。
不!IOCP机制的一个优点是,您可以将读/写请求及其关联的缓冲区排队到内核,并由内核线程池在内核状态中执行IO操作。这是一个I/O完成端口,即,您会在操作完成后得到通知。
如果是读取,则返回带有数据已经加载的缓冲区(指针),您不需要再次显式地读取/复制。
如果是写入,则数据已经传输,并且您返回的缓冲区(指针)可供删除/重用/重新汇集/其他操作。

但这个问题不是说相反的吗:http://stackoverflow.com/questions/28644276/io-completion-ports-and-socket-recv - user4582812
我的意思是,当我将套接字与完成端口关联,想要读取时,是否应该调用 'recv()'? - user4582812
@user4582812 - 给出的答案(并被接受)与IOCP毫不相关 - 它不是一个答案。 - Martin James
不适合在IOCP中调用recv()。当您收到通知时,您无需读取I/O完成通知,因为读取操作已经完成 - 您的缓冲区已经加载了接收到的数据。 - Martin James
1
好的,所以在我将套接字与完成端口关联之后,我调用WASRecv()(我认为它保存了我的缓冲区?),然后当我收到通知时,通知只是指示数据被读入我提供的缓冲区? - user4582812
1
@user4582812 - 好的,现在你懂了 :) - Martin James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接