《Windows网络编程案例教程》-董相志 学习记录 异步套接字编程
2.4 异步套接字编程
- 异步套接字客户机编程
- 异步套接字服务器编程
- 服务器响应客户机群的并发访问
2.4.1 异步套接字客户机编程
创建步骤如下:
1.创建程序界面,显示窗体和控件
2.定义宏常量
3.异步套接字初始化
4.配置套接字地址信息
5.连接服务器
6.在窗体回调函数里处理套接字消息事件
表2.5 套接字事件列表
//程序2.9 异步套接字客户机完整代码
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define IDC_EDIT_IN 101
#define IDC_EDIT_OUT 102
#define IDC_MAIN_BUTTON 103
#define WM_SOCKET 104
char *szServer="localhost";
int nPort=5555;
HWND hEditIn=NULL;
HWND hEditOut=NULL;
SOCKET Socket=NULL;
char szHistory[10000];
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEX));
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName="Window Class";
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,
"窗体类注册失败!\r\n错误码:"+nResult,
"窗体类错误",
MB_ICONERROR);
}
HWND hWnd=CreateWindowEx(NULL,
"Window Class",
"异步套接字客户机",
WS_OVERLAPPEDWINDOW,
200,
200,
500,
400,
NULL,
NULL,
hInst,
NULL);
if(!hWnd)
{
int nResult=GetLastError();
MessageBox(NULL,
"创建窗体失败\r\n错误码:",
"创建窗体失败",
MB_ICONERROR);
}
ShowWindow(hWnd,nShowCmd);
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
ZeroMemory(szHistory,sizeof(szHistory));
// 创建接收消息框
hEditIn=CreateWindowEx(WS_EX_CLIENTEDGE,
"EDIT",
"",
WS_CHILD|WS_VISIBLE|ES_MULTILINE|
ES_AUTOVSCROLL|ES_AUTOHSCROLL,
50,
100,
400,
200,
hWnd,
(HMENU)IDC_EDIT_IN,
GetModuleHandle(NULL),
NULL);
if(!hEditIn)
{
MessageBox(hWnd,
"不能创建接收消息框",
"错误",
MB_OK|MB_ICONERROR);
}
HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hEditIn,
WM_SETFONT,
(WPARAM)hfDefault,
MAKELPARAM(FALSE,0));
SendMessage(hEditIn,
WM_SETTEXT,
NULL,
(LPARAM)"正在连接服务器...");
//创建发送消息框
hEditOut=CreateWindowEx(WS_EX_CLIENTEDGE,
"EDIT",
"",
WS_CHILD|WS_VISIBLE|ES_MULTILINE|
ES_AUTOVSCROLL|ES_AUTOHSCROLL,
50,
30,
400,
60,
hWnd,
(HMENU)IDC_EDIT_IN,
GetModuleHandle(NULL),
NULL);
if(!hEditOut)
{
MessageBox(hWnd,
"不能创建发送消息框",
"错误"