IO完成端口和套接字WSARecv()
IO Completion Ports and socket WSARecv()
我正在努力了解IOCP如何使用套接字。我需要了解它们是否就是这样工作的:
我创建了一个完成端口,它只是一个队列,当某个操作完成时,它将接收通知,然后我将套接字与它关联,然后我处理传入的通知。
现在我想知道这与从套接字接收数据的关系,所以当我调用WSARecv()
时,究竟发生了什么,WSARecv()
在我调用它时会立即返回吗(不阻塞),然后当数据到达WSARecv()
时,我会收到数据已接收的通知吗?
是的,就是这样。
当您调用WSARecv()
时,函数将立即返回(请注意,您必须向它传递一个缓冲区来存储接收到的数据)。现在,系统将读取从另一端接收的数据,并将其存储在提供的缓冲区中。当系统执行此操作时,它将在完成端口中放置一个通知,通知您读取操作已完成。
如果想了解更多关于IOCP、WSARecv()和Sockets的信息,请参阅我为自学该主题而制作的示例项目。
单击此处导航到套接字完成服务器代码
您必须熟悉GetQueuedCompletionStatus(),它位于线程循环中,等待事件返回。因为当队列中没有任何内容时,线程会进入块模式,所以线程的行为也会像在等待中一样。
一旦GetQueuedCompleteionStatus()返回,它现在已被取消阻止,进程将继续评估缓冲区的内容。只需用代码填写您想要如何处理缓冲区。
对于WSARecv(),调用该函数将触发套接字API用数据填充缓冲区。由于它是重叠,WSARecv()将不会阻塞并立即返回。有一种方法可以通过简单地调用GetQueuedCompleteionStatus()来知道何时引发完成事件。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 如何在使用WSARecv()和IOCP时知道套接字何时接收到FIN数据包
- WSARecv 有时会返回与 IOCP 端口关联的套接字的"invalid handle (error no 6)"。(C++)
- IO完成端口和套接字WSARecv()
- WSARecv在套接字编程窗口中执行大约需要3秒