winSockets编程(七)WSAAsyncSelect模式

占位##

#include <WinSock2.h>
#include <Windows.h>
#include <StrSafe.h>

#pragma comment(lib, "Ws2_32")

#define WM_SOCKET WM_USER+1 //定义SOCKET消息;

LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_SOCKET:
        {
            if(WSAGETSELECTERROR(lParam))
            {
                shutdown(wParam, SD_BOTH);
                closesocket(wParam);
                return 0;
            }

            switch (WSAGETSELECTEVENT(lParam))
            {
                case FD_ACCEPT:
                {
                    SOCKET client = accept(wParam, NULL, NULL);
                    WSAAsyncSelect(client, hWnd, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE);
                }
                    break;
                case FD_WRITE:
                    break;
                case FD_READ:
                {
                    CHAR szText[1024] = { 0 };
                    if (SOCKET_ERROR == recv(wParam, szText, 1024, 0))
                    {
                        shutdown(wParam, SD_BOTH);
                        closesocket(wParam);
                    }
                    else
                    {
                        CHAR szMsg[1100] = "接收数据:";
                        strcat_s(szMsg, sizeof(szMsg), szText);
                        MessageBoxA(hWnd, szMsg, "结果", MB_OK);
                    }
                }
                    break;
                case FD_CLOSE:
                    shutdown(wParam, SD_BOTH);
                    closesocket(wParam);
                    break;
            }
        }
        return 0;
        
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR pcszCommand, int iShow)
{
    TCHAR szAppName[] = TEXT("WSAAsyncSelect");
    WNDCLASSEX wndClsEx;

    wndClsEx.cbClsExtra = 0;
    wndClsEx.cbSize = sizeof(wndClsEx);
    wndClsEx.cbWndExtra = 0;
    wndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClsEx.hIconSm = NULL;
    wndClsEx.hInstance = hInstance;
    wndClsEx.lpfnWndProc = WinProc;
    wndClsEx.lpszClassName = szAppName;
    wndClsEx.lpszMenuName = NULL;
    wndClsEx.style = CS_HREDRAW | CS_VREDRAW;

    if (!RegisterClassEx(&wndClsEx))
    {
        MessageBox(NULL, TEXT("注册窗口类失败,本程序需要在Windows NT系统上才能运行。"), TEXT("错误"), MB_OK | MB_ICONERROR);
        return 0;
    }

    HWND hWnd = CreateWindowEx(
        0,
        szAppName,
        szAppName,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);
    if (NULL == hWnd)
    {
        MessageBox(NULL, TEXT("创建窗口失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
        return 0;
    }

    ShowWindow(hWnd, iShow);
    UpdateWindow(hWnd);

    WSADATA wsaData;
    WSAStartup(WINSOCK_VERSION, &wsaData);

    SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == sListen)
    {
        MessageBox(hWnd, TEXT("创建套接字失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
        WSACleanup();
        return 0;
    }

    SOCKADDR_IN sin;
    USHORT uPort = 4567;

    ZeroMemory(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(uPort);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;

    if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
    {
        MessageBox(hWnd, TEXT("绑定套接字失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
        shutdown(sListen, SD_RECEIVE);
        closesocket(sListen);
        WSACleanup();
        return 0;
    }

    //将套接字设为窗口通知消息类型
    WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
    listen(sListen, 5);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    WSACleanup();
    return msg.wParam;
}

 

转载于:https://www.cnblogs.com/tinaluo/p/7699122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值