远控代码的重构-远控网络编程的设计上

套路化代码

但是我们这是一个MFC工程,我们需要考虑不是所有操作都需要到main函数里面实现,有些操作可以在main函数之前完成,有些可以在main函数返回以后完成,静态全局变量满足这个需求,我们需要添加一个自己的类

编辑器细节1

添加类和添加类向导的区别,一个是添加自己的类,一个是添加MFC的类

添加上CServerSocket全局静态类(独立于main之外),在构造函数里面添加上套接字的初始化函数,在析构函数里面添加上套接字的清理函数

c++ 复制代码
#pragma once
#include "pch.h"
#include "framework.h"


class CServerSocket
{
public:
	CServerSocket(){
		if (InitSockEnv() == FALSE) {
			MessageBox(NULL, _T("无法初始化套接字环境,请检查网络设置!"), _T("初始化错误!"), MB_OK | MB_ICONERROR);
			exit(0);
		}
	}
	~CServerSocket() {
		WSACleanup();
	}
	BOOL InitSockEnv() {
		WSADATA data;
		if (WSAStartup(MAKEWORD(1, 1), &data) != 0) { //TODO:返回值处理}
			return FALSE;
		}
		return TRUE;
	}
};

extern CServerSocket server;

为什么添加pch.hframework.h头文件?因为有些网络编程的头文件在这框架的头文件里面

那么我们怎么在RemoteCtrl.cpp文件里面用上这个全局静态类呢?

因为**声明可以多次,定义只能一次。**所以我们在ServerSocket.cpp里面定义一个ServerSocket类的对象

然后在头文件里面靠extern这个对象,来让外面包含这个头文件时候使用(被多次包含也没有关系,因为可以多次声明)

c++ 复制代码
extern int i; //声明,不是定义
int i; //声明,也是定义

然后我们需要明确一点的是进main之前,我们肯定是单线程,开天辟地前的井井有条,到main,我们可能开始需要定义多线程,然后退出main时也只剩下一个进程了,毁天灭地后的井井有条

代码如下:

c++ 复制代码
int main()
{
    int nRetCode = 0;
    //int a;

    HMODULE hModule = ::GetModuleHandle(nullptr);

    if (hModule != nullptr)
    {
        // 初始化 MFC 并在失败时显示错误
        if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
        {
            // TODO: 在此处为应用程序的行为编写代码。
            wprintf(L"错误: MFC 初始化失败\n");
            nRetCode = 1;
        }
        else
        { 
            // TODO: 在此处为应用程序的行为编写代码。
            server;
            WSADATA data;
            SOCKET serv_sock = socket(PF_INET, SOCK_STREAM, 0); //TCP
            //TODO:校验
            sockaddr_in serv_adr, client_adr;
            memset(&serv_adr, 0, sizeof(serv_adr));
            serv_adr.sin_family = AF_INET;
            serv_adr.sin_addr.s_addr = INADDR_ANY; //服务器可能有4个IP等,监听所有地址
            serv_adr.sin_port = htons(9527);
            //绑定
            bind(serv_sock, (sockaddr*)&serv_adr, sizeof(serv_adr)); //TODO
            //TODO:
            listen(serv_sock, 1); //控制端是1对1的
            char buffer[1024];
            //int cli_sz = sizeof(client_adr);
            //SOCKET client = accept(serv_sock, (sockaddr*)&client_adr,&cli_sz)
            //recv(serv_sock, buffer, sizeof(buffer), 0);
            //send(serv_sock, buffer, sizeof(buffer), 0);
            closesocket(serv_sock);
            //全局的静态变量
        }
    }

当下还没有解决的问题:

要是别人继续定义一个CServerSocket的局部对象,进去后又执行一道构造函数,退出时候提前执行了析构函数,那么网络环境全部乱套了

下一篇文章就是要用单例模式来解决这个问题

相关推荐
盟接之桥2 小时前
盟接之桥®制造业EDI软件,打通全球供应链“最后一公里”,赋能中国制造连接世界
网络·安全·低代码·重构·汽车·制造
北京软秦科技有限公司3 小时前
IA-Lab AI 检测报告生成助手:从“慢、错、贵、难控”到高效稳定,重构TIC行业报告生产逻辑
重构
DeepSCRM4 小时前
跨境 SaaS 架构深度解析:如何利用浏览器指纹隔离与 AI 矩阵重构海外私域流量池?
大数据·人工智能·重构
CHU7290354 小时前
在线教学课堂APP功能版块设计方案:重构学习场景的交互逻辑
java·学习·小程序·重构
AI先驱体验官4 小时前
实时交互数字人:企业服务场景的技术落地分析
大数据·运维·人工智能·重构·aigc
love530love5 小时前
从零搭建本地版 Claurst:基于 Rust 重构的 Claude Code 终端编码助手 + LM Studio 模型接入测试
开发语言·人工智能·windows·重构·rust·lm studio·claude code
量子炒饭大师6 小时前
【C++11】Cyber骇客的 亡骸剥离与右值重构 ——【右值引用 与 移动语义】(附带完整代码解析)
java·c++·重构·c++11·右值引用·移动语义
今夕资源网1 天前
Pogget 轻量化文件效率工具,重构文件交互逻辑,实现音速启动与快捷方式统一管理
重构·快速启动·音速启动·桌面快捷方式管理
EasyGBS1 天前
从“看得见”到“看得安全”:国密GB35114国标GB28181平台EasyGBS双标协同重构安防视频安全体系
网络·安全·重构
互联网散修2 天前
零基础鸿蒙应用开发第二十九节:策略模式重构电商促销系统
重构·策略模式·鸿蒙零基础入门