• MFC-网络编程TCP服务端(NBlockSocket)


    目录

    1、NBlockSocket.h类:

    (1)、Init接口函数

    (2)、Register接口函数

    (3)、Send接口函数

    (4)、Accept接口函数

    (5)、Recv接口函数

    2、实现通讯:

    (1)、初始化服务器,注册回调函数

    (2)、回调函数

    (3)、实现信息的分发和显示

    3、配置类的添加:

    (1)、数据解释写入文档

    (2)、数据解析查找文档

    4、运行UI: 


    1、NBlockSocket.h类:

    (1)、Init接口函数

    bool Init(int port);

    初始化Socket,创建用于监听的Socket,设置Socket为非阻塞模式,设置服务器Socket地址,绑定Socket Server到本地地址,监听

    (2)、Register接口函数

    void Register(void *hWin, int id, CBFun pCallBack);

     传递当前窗口指针,唯一标识当前回调函数的ID和回调函数

    (3)、Send接口函数

    bool Send(CString msg);

    服务端分发消息 

    (4)、Accept接口函数

    bool Accept();

    函数的作用接收客户端连接请求,并根据不同情况返回状态值,当连接客户端成功会调用回调函数来处理客户端发送的数据

    (5)、Recv接口函数

    bool Recv()

    函数作用接收数据

    2、实现通讯:

    (1)、初始化服务器,注册回调函数

    // 初始化服务端,指定监听的端口号
        int port = 8080; // 指定监听的端口号
        m_nsocketserver.Init(port);

        // 注册回调函数,用于处理接收到的消息
        m_nsocketserver.Register(this, 1, &CTCPServerDlg::OnSocketMessage);

    (2)、回调函数

    回调函数要设置为静态成员函数目的:

    非静态成员函数属于对象,他默认指针指向它的对象,在没有实例化的情况下无法确定this指针。静态成员函数属于类,回调函数需要经常访问其他的类,为了避免一直需要实例化对象,所以设置为静态成员函数

    定义回调函数,定义指向回调函数的指针类型

    typedef void(*CBFun)(void *hWin,int id, char *);/*类型别名CBFun,它表示指向函数的指针*/

      void Register(void *hWin, int id, CBFun pCallBack);

    声明回调函数,静态,指针类型

    static void OnSocketMessage(void *hWin, int id, char *msg);

    注册回调函数

    // 注册回调函数,用于处理接收到的消息
        m_nsocketserver.Register(this, 1, &CTCPServerDlg::OnSocketMessage);

    (3)、实现信息的分发和显示

    实现回调函数

    CTCPServerDlg *pdlg = static_cast(hWin);//传递的指针void*强制转换

    CString strMsg(msg);

    pdlg->SetDlgItemTextW(IDC_EDIT_MESSAGE, strMsg);

    pdlg->m_nsocketserver.Send(strMsg);//分发消息
    pdlg->SetDlgItemTextW(IDC_EDIT_MESSAGE, strMsg);

    3、配置类的添加:

    (1)、数据解释写入文档

    if (pdlg->IsDlgButtonChecked(IDC_CHECK_ADD_PRESE))
            {
                CString filepath = L"绝对路径";
                CString sectionName = L"Section2";
                CString variableName = L"1";
                CString valueToWrite = L"找到1";
                IniFileWrite(sectionName, variableName, valueToWrite, filepath);
                pdlg->MessageBox(L"写入成功!");
                pdlg->m_nsocketserver.Send(strMsg);//分发消息
                pdlg->SetDlgItemTextW(IDC_EDIT_MESSAGE, strMsg);
            }

    (2)、数据解析查找文档

    else if (pdlg->IsDlgButtonChecked(IDC_CHECK_PRASE))
            {
                CString filepath = L"绝对路径";
                const CString cstr = L"未找到";
                pdlg->m_nsocketserver.Send(strMsg);//分发消息
                pdlg->GetDlgItemTextW(IDC_EDIT_MESSAGE, strMsg);
                strMsg = IniFileRead(L"Section2", strMsg, cstr, filepath);
                pdlg->SetDlgItemTextW(IDC_EDIT_MESSAGE, strMsg);
            }

    4、运行UI: 

  • 相关阅读:
    VUE3实战一之项目搭建
    Spring面试题21:说一说Spring的@Required注解和@Qualifier注解
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    java int类型数据溢出问题 时钟 原码 反码 补码 二进制
    java---IO流:特殊操作流
    About Simple Data Visualization
    IntelliJ IDEA使用——常规设置
    mybatisPlus-mapper的注入值得思考
    scrapy爬取数据
    LabVIEW中不同颜色连线的含义
  • 原文地址:https://blog.csdn.net/qq_59328991/article/details/134259614