网络头文件、网络库:
打开网络库:
校验版本:
创建socket:
绑定地址端口:
完成端口和socketServer绑定:
HANDLE WINAPI CreateIoCompletionPort(
_In_ HANDLE FileHandle,
_In_opt_ HANDLE ExistingCompletionPort,
_In_ ULONG_PTR CompletionKey,
_In_ DWORD NumberOfConcurrentThreads
);
功能:创建完成端口, 将完成端口和socket绑定
1.参数1:INVALID_HANDLE_VALUE,
4.参数4允许此端口上最多同时运行的线程数量, 0:系统自动获取CPU核数2倍
3.和socket一起绑定的信息(可以是下标等, 调用GetQueuedCompletionStatus()后会获得该信息, 用来标识到底是哪个socket)
失败:0, WSAGetLastError():完成端口是windows一种机制, 和网络无关, 文件操作也可以用到
开始监听:
投递AcceptEx:
在投递之后创建线程:
void GetSystemInfo(
LPSYSTEM_INFO lpSystemInfo
);
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
2.指定线程栈的大小:0默认1M, 以字节为单位(保留/提交由参数5决定)
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
CREATE_SUSPENDED:挂起(随时可以激活)
STACK_SIZE_PARAM_IS_A_PESERVATION:和参数2关联, 设置:参数2就是栈保留大小, 不设置:参数2就是栈提交大小
成功:线程句柄(内核对象)释放线程:CloseHandle
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
BOOL WINAPI GetQueuedCompletionStatus(
_In_ HANDLE CompletionPort,
_Out_ LPDWORD lpNumberOfBytes,
_Out_ PULONG_PTR lpCompletionKey,
_Out_ LPOVERLAPPED *lpOverlapped,
_In_ DWORD dwMilliseconds
);
功能:尝试从指定的IO完成端口取出IO完成数据包, 没有通知时, 线程挂起, 不占用CPU时间片
3.CreateIoCompletionPort传递过来的数据
完成端口所有处理都放在线程中即可, 所有的操作完成之后都会给完成端口发送通知, 所以PostAccept、PostRecv、PostSend函数中不用写处理代码