事件选择模型
简介
事件选择(WSAEventSelect)模型是另一个有用的异步 I/O 模型。和 WSAAsyncSelect 模型类似的
是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知,最主要的差别在于
网络事件会投递至一个事件对象句柄,而非投递到一个窗口例程。
事件通知模型要求我们的应用程序针对使用的每一个套接字,首先创建一个事件对象。创建方法是调用
WSACreateEvent 函数
接下来必须将其与某个套接字关联在一起,同时注册自己感兴趣的网络事件类型
return 0;
case WM_SOCKET:
if (WSAGETSELECTERROR(lParam))
{
closesocket(wParam); //socket出错
break;
}
switch (WSAGETSELECTEVENT(lParam))//取低位字节,网络事件
{
case FD_ACCEPT:
//接受客户端连接
sClient = accept(wParam, (struct sockaddr*) & client, &iAddrSize);
//为客户端注册FD_READ、FD_CLOSE消息
WSAAsyncSelect(sClient, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);
break;
case FD_READ:
ret = recv(wParam, szMessage, MSGSIZE, 0);
if (ret == 0 || ret == SOCKET_ERROR && WSAGetLastError() ==
WSAECONNRESET)
{
closesocket(wParam);
}
else
{
szMessage[ret] = '\0';
MessageBox(NULL, szMessage, NULL, MB_OK);
}
break;
case FD_CLOSE:
closesocket(wParam);
break;
}
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}