前言
之前简单学了一下IOCP,这里结合晚上的示例,写一个简单的IOCP测试代码。
代码
服务端代码
代码结构
这里通过主线程进行主要代码管理、各种SOCKET和IOCP对象的创建、WSARECV的投递、退出IOCP等待等操作。
子线程就负责从GetQueuedCompletionStatus()中获取完成的信息。
主要参考以下文章中的模型:
IO完成端口(IOCP) - 木文的文章 - 知乎
用户态和内核态的相对关系:
主线程和子线程的工作流程:
图片来源:
IO完成端口(IOCP) - 木文的文章 - 知乎
代码
#include <WinSock2.h>
#include <iostream>
#include <thread>
#include <mutex>
#pragma comment(lib, "ws2_32.lib")
std::mutex mtx;
inline void OPT(const char * head, const char* msg)
{
std::lock_guard<std::mutex> lkg(mtx);
std::cout << head << " - " << msg << std::endl;
}
HANDLE hIOCP = nullptr;
struct IOContext {
OVERLAPPED overlapped{};
WSABUF wsaBuf{ 1024, buffer };
CHAR buffer[1024]{};
SOCKET socket = INVALID_SOCKET;
DWORD nBytes = 0;
};
子线程
void _func()
{
OPT("child thread","IN");
IOContext* ioContext = nullptr;
DWORD lpNumberOfBytesTransferred = 0;
void* lpCompletionKey = nullptr;
DWORD dwFlags = 0;
DWORD nBytes = 1024;
while (true) {
OPT("child thread", "before GetQueuedCompletionStatus()");
//等待GetQueuedCompletionStatus()返回完成的ioContext。
//这里的阻塞选项选择的INFINITE,就是一直等待。
BOOL b