当前位置: 首页 > news >正文

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

套路化代码

但是我们这是一个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.mrgr.cn/news/52680.html

相关文章:

  • SQL优化 - Limit优化
  • 腾讯域名续费的步骤怎么做的? 忘记了注册的用户名和密码
  • 【编程语言】C++ 中 vector 的常用操作方法
  • 10-Python基础编程之函数
  • SpringColoud GateWay 核心组件
  • java_跳转控制语句break
  • 力扣(leetcode)每日一题 3191 使二进制数组全部等于 1 的最少操作次数 I |贪心
  • px、rem、em等单位的区别
  • 【分布式微服务云原生】《解锁分布式锁的奥秘:由来、场景与技术大揭秘》
  • 晶体与晶振的区别
  • 华为杯”第十三届中国研究生数学建模竞赛-B题:具有遗传性疾病和性状的遗传位点分析(附MATLAB代码实现)
  • 【BGA布局布线-熬夜加班整理】
  • 网络编程基础-IO模型深入理解
  • Python酷库之旅-第三方库Pandas(157)
  • vs code 正则提取文本
  • Xamarin学习计划
  • JVM的基础
  • MyBatis Plus
  • Linux中pip安装python包失败原因是缺少python3-dev
  • C/C++逆向与反汇编01-寻找主函数