4.3.2异步选择模型
异步选择WSAAsyncSelect是Select模型的异步版本。在Select模型中,调用select()函数会发生阻塞;而WSAAsyncSelect模型在调用WSAAsyncSelect()函数时,它会通知系统感兴趣的网络事件,然后立即返回。
在前面,我们在windows下创建的都是控制台程序;本小节的代码则是windows应用程序。使用WSAAsyncSelect模型,必须在应用程序中创建一个窗口,并为窗口提供回调函数(窗口处理函数)。
//异步选择:TCP服务器端代码
#include <iostream>
#include <winsock.h>
#include <tchar.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define WM_SOCKET WM_USER+1
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//windows应用程序的入口函数:WinMain,其参数必须和声明保持一致;返回0表示正常退出
//参数1:当前实例的句柄;参数2:前一个实例的句柄;参数3:命令行参数;参数4:窗体显示形式(最大化、最小化)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = _T("AsyncSelect Model");
//步骤1:窗口类定义
WNDCLASS wndclass;//WNDCLASS结构体用来存储窗口信息
wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口的样式
wndclass.lpfnWndProc = WndProc;//定义窗口处理函数
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;//当前实例句柄,由windows自动分发
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//窗口的最小化图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 窗口光标:采用箭头
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景:白色
wndclass.lpszMenuName = NULL; //窗口无菜单
wndclass.lpszClassName = szAppName; //窗口类名
//步骤2:注册窗口
if (!RegisterClass(&wndclass))