~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  514 随笔 :: 26 文章 :: 15 评论 :: 62万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

占位##

复制代码
#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;
}
复制代码

 

————————————————
版权声明:本文为博客园博主「天涯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
posted on   LuoTian  阅读(339)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示