这是我参与11月更文挑战的第二十五天,活动详情查看:2021最后一次更文挑战
异步选择模型
前言
掌握创建基本窗口的代码,以及回调函数的概念;掌握异步选择模型的通讯过程;掌握异步选择模型的代码实现。
内容和步骤
服务器端:
实现基本窗口功能:
1、创建窗口结构体:WNDCLASSEX(这一步不能少设置属性,否则会在第三步失败)
1 | ini复制代码WNDCLASSEX wndc; |
2、注册窗口结构体:RegisterClassEx
1 | ini复制代码int regid = RegisterClassEx(&wndc); |
3、创建窗口:CreateWindowEx
1 | ini复制代码HWND hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "emptywnd", "窗口标题", WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); |
4、显示窗口:ShowWindow
1 | scss复制代码howWindow(hWnd, SW_NORMAL); |
5、网络通信功能, SOCKET初始化操作
1 | ini复制代码WORD wdVersion = MAKEWORD(2, 2); |
5.1.打开网络库
1 | arduino复制代码if (0 != nRes) |
5.2.校验版本
1 | scss复制代码if (2 != HIBYTE(wdScokMsg.wVersion) || 2 != LOBYTE(wdScokMsg.wVersion)) |
5.3.创建SOCKET
1 | ini复制代码SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
5.4.绑定地址与端口
1 | scss复制代码if (SOCKET_ERROR == bind(socketServer, (const struct sockaddr*)&si, sizeof(si))) |
5.6.绑定消息和服务器SOCKET,并投递给操作系统
1 | scss复制代码if (WSAAsyncSelect(socketServer, hWnd, UM_ASYNCSELECTMSG, FD_ACCEPT) == SOCKET_ERROR)//失败处理 |
6、消息循环:GetMessage、TranslateMessage、DispatchMessage
1 | scss复制代码MSG msg; |
7、创建回调函数
LRESULT CALLBACK callBackProc(HWND hWnd, UINT msgID, WPARAM wparam, LPARAM lparam)
7.1从wparam中获取socket句柄
SOCKET sock = (SOCKET)wparam;
7.2获取操作码,使用分支语句进行判断分别进行处理
1 | scss复制代码switch (LOWORD(lparam)) |
8、关闭SOCKET句柄
1 | scss复制代码ReleaseDC(hWnd, hdc);//释放hdc |
运行结果
如何理解异步、同步
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
本文转载自: 掘金