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

news2024/10/18 6:12:25

套路化代码

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

编辑器细节1

Snipaste_2024-10-18_00-52-20

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

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

#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这个对象,来让外面包含这个头文件时候使用(被多次包含也没有关系,因为可以多次声明)

extern int i; //声明,不是定义
int i; //声明,也是定义

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

代码如下:

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的局部对象,进去后又执行一道构造函数,退出时候提前执行了析构函数,那么网络环境全部乱套了

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python之爬虫读取网页数据

目录: 1、简介2、代码示例3、验证4、项目示例5、网页数据提取 1、简介 选择Python作为爬虫开发的首选语言‌,主要是因为Python具有简洁易学的语法、丰富的库支持、跨平台特性、强大的社区支持、动态类型、可扩展性以及异步编程支持等优势。‌ ‌简洁易学…

4.7 大数据应用场景

文章目录 今天,我非常荣幸能与大家分享一个充满潜力和变革的主题——大数据的应用场景。在这个信息爆炸的时代,大数据已经成为推动各行各业发展的重要驱动力。接下来,我将带领大家探索大数据在不同行业中的神奇应用。 首先,让我们…

计算机领域快刊合集,无版面费,初审仅2天!

投稿选刊不迷路,就到科检易学术 本期主要给大家介绍,计算领域方向的期刊,无需版面费,非常适合正在毕业or晋升的学者。 期刊一 APPLIED INTELLIGENCE IF:3.4 JCR2区中科院3区 【自引率】11.8% 【年发文量】1000篇左右 初审…

python函数返回值是什么

函数返回值简介 1、简单介绍print和return的区别,print仅仅是打印在控制台,而return则是将return后面的部分作为返回值:作为函数的输出,可以用变量接走,继续使用该返回值做其它事。 2、函数需要先定义后调用&#xf…

详解Oracle审计(二)

题记: 本文将承接上篇详细介绍oracle的审计功能,基于11g版本,但对12c,19c也同样适用。 1. 语句审计实操演示实例 sqlplus / as sysdba show parameter audit_trail alter system set audit_traildb_extended scopespfile; star…

从0开始深度学习(11)——多层感知机

前面介绍了线性神经网络,但是线性模型是有可能出错的,因为线性模型意味着是单调假设,但是现实中往往很复杂。例如,我们想要根据体温预测死亡率。 对体温高于37摄氏度的人来说,温度越高风险越大。 然而,对体…

LeetCode 3200.三角形的最大高度:枚举

【LetMeFly】3200.三角形的最大高度:枚举 力扣题目链接:https://leetcode.cn/problems/maximum-height-of-a-triangle/ 给你两个整数 red 和 blue,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行…

远距离长航时低成本泡沫垂直起降固定翼无人机技术详解

关于远距离长航时低成本泡沫垂直起降固定翼无人机技术,以下是一个详细的技术解析: 一、技术概述 远距离长航时低成本泡沫垂直起降固定翼无人机是一种结合了垂直起降技术和固定翼设计优势的无人机系统。该技术通过采用泡沫材料制造无人机机体&#xff0…

iOS IPA上传到App Store Connect的三种方案详解

引言 在iOS应用开发中,完成开发后的重要一步就是将IPA文件上传到App Store Connect以便进行测试或发布到App Store。无论是使用Xcode进行原生开发,还是通过uni-app、Flutter等跨平台工具生成的IPA文件,上传到App Store的流程都是类似的。苹果…

车易泊车位管理相机 —— 智能管理,停车无忧

在现代城市生活中,停车问题一直是困扰着车主和城市管理者的难题。车位难找、停车管理混乱等问题不仅浪费了人们的时间和精力,也影响了城市的交通秩序和形象。而车易泊车位管理相机的出现,为解决这些问题提供了一种高效、智能的解决方案。 一、…

DataWhale10月动手实践——Bot应用开发task03学习笔记

一、工作流 1. 工作流的定义 工作流由多个节点组成,这些节点可以包括大语言模型(LLM)、代码模块、逻辑判断工具、插件等。每个节点需要不同的信息来执行其功能。工作流的核心含义是:对工作流程及其操作步骤之间的业务规则进行抽…

无人机之位置信息计算篇

一、主要导航技术 卫星导航 全球定位系统(GPS):无人机上装有专门的接收器,用于捕获GPS系统发射的无线电信号。当无人机接收到来自至少四颗卫星的信号时,通过计算信号抵达时间的微小差异,即可运用三角定位…

SQL语句查询

SQL语句查询 查询产生一个虚拟表 看到的是表形式显示的结果&#xff0c;但结果并不真正存储 每次执行查询只是从数据表中提取数据&#xff0c;并按照表的形式显示出来 查询语法 SELECT <列名> FROM <表名> [WHERE <查询条件表达式>] SELECT …

插齿刀的齿数选择不同会有什么影响?

插齿——作为一种常用的制齿手段&#xff0c;经常被用到有台肩的齿轮以及空刀槽很窄的双联或多联齿轮&#xff0c;以及各种内齿加工中。虽然强力车齿在现在应用的越来越多了&#xff0c;但是插齿这种加工应该在相当长的一段时间内还是会继续服役的。中这期咱们聊聊插齿刀齿数对…

显示指定目录下所有.c文件中出现指定字符串的行号 Linux环境 C语言实现

问题&#xff1a;显示指定目录及其后代目录下所有.c文件中出现指定字符串的行号 算法&#xff1a; 分为两个文件编写 &#xff1a; display_string_lineno.c &#xff0c; Read_line.c 分为三个函数编写 &#xff1a; void display_lineno(char* dirname,const char *pstr)…

sankey.top - 桑基图/桑吉图/流程图/能量流/物料流/能量分析

sankey.top 桑基图大师(SankeyMaster)是您创建复杂桑基图表的首选工具。轻松输入数据并创建桑基图表&#xff0c;准确揭示复杂的数据关系&#xff01; 应用 https://apps.apple.com/cn/app/sankeymaster-sankey-diagram/id6474908221 在线编辑器 https://studio.sankeymaste…

解决ultralytics中的YOLOv8在执行task.py文件添加模块操作出现的KeyError报错

报错详情&#xff1a; 在ultralytics项目文件夹内运行/home/xxx/ultralytics/train.py进行单GPU训练的时候训练可以正常进行 from ultralytics import YOLO# Load a model model YOLO("/home/xxx/ultralytics/ultralytics/cfg/models/v8/yolov8s-FASFF.yaml") # …

Github学生包的JetBrains认证过期/idea认证过期如何解决?

官网通过Github更新状态即可JetBrains Account 注意要到邮箱走流程

自动化测试与敏捷开发的重要性

敏捷开发与自动化测试是现代软件开发中两个至关重要的实践&#xff0c;它们相互补充&#xff0c;共同促进了软件质量和开发效率的提升。 敏捷开发的重要性 敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调以下几个核心价值观和原则&#xff1a; 个体和交互…

力扣 简单 83.删除排序链表中的重复元素

文章目录 题目介绍题解 题目介绍 题解 法一&#xff1a;带dummy node class Solution {public ListNode deleteDuplicates(ListNode head) {//根据提示&#xff0c;val的值在-100~100&#xff0c;如果括号里面不填则默认dummy.val0&#xff0c;可能会和某些测试用例的val一样…