文章目录
前言
- 前言
- 一、开发前的配置 ( 头文件 | 编译参数设置 )
- 二、网络初始化 WSAStartup 与清理 WSACleanup 操作
本篇博客重点分析 CNetwork
网络模块 ;
Windows 中引入网络套接字头文件注意事项 : 必须先引入 WinSock2.h
头文件 , 然后 再引入 Windows.h
头文件 , 否则会报错 ;
#include // WinSock2.h 头文件 必须在 Windows.h 头文件前面
#include // Windows.h 头文件 必须在 WinSock2.h 头文件后面
使用代码 记录 编译参数选项 :
#pragma warning(disable:4996)
#pragma comment(lib,"Ws2_32.lib")
格式风格宏定义 :
#define FORMAT_STYLE (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS)
二、网络初始化 WSAStartup 与清理 WSACleanup 操作
在 CNetwork
中 , 定义了一个 WSAPrepare
私有类 ,
在 Windows 中调用网络功能 , 必须执行 WSAStartup
初始化函数 , 否则无法使用网络功能 ; 使用完毕后 , 一定要执行 WSACleanup
函数 , 否则之后的网络操作都会受到影响 ;
上述初始化网络 , 清理网络 操作 , 在使用前初始化 , 使用完毕后清理 ;
使用过程中 , 会创建多个 CNetwork
对象 , 只需要在第一个对象创建前初始化 , 最后一个对象析构后清理即可 ;
没有必要在每个对象中都 执行 网络的初始化 与 清理操作 ; 因此 WSAPrepare
变量被定义成私有静态变量 ;
在 CNetwork.cpp
中声明了 CNetwork::WSAPrepare CNetwork::wsaforwin;
, 确保网络一定会被初始化 , 初始化和析构时 , 不影响网络功能的使用 ;
CNetwork.h 源码 :
#pragma once
#include // WinSock2.h 头文件 必须在 Windows.h 头文件前面
#include // Windows.h 头文件 必须在 WinSock2.h 头文件后面
#include
#include
#include
#include "../Json/json.h"
enum {
CMD_READ_DATA = 1,
CMD_WRITE_GOLD,
CMD_WRITE_EXP
};
#pragma warning(disable:4996)
#pragma comment(lib,"Ws2_32.lib")
#define FORMAT_STYLE (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS)
class CNetwork
{
public:
CNetwork();
~CNetwork();
bool WaitClientOnline();//等待客户端上线
bool ReadData(Json::Value& root);//读取数据
bool WriteGold(double gold);//修改金币
bool WriteExp(unsigned exp);//修改经验
public:
static CString GetErrorString();
private:
SOCKET m_server;
private:
/* 该私有类的作用是用于整体的网络初始化
在 Windows 中调用网络功能 , 必须执行 WSAStartup 初始化函数 , 否则无法使用网络功能
使用完毕后 , 一定要执行 WSACleanup 函数 , 否则之后的网络操作都会受到影响
上述初始化网络 , 清理网络 操作 , 在使用前初始化 , 使用完毕后清理 ;
使用过程中 , 会创建多个 CNetwork 对象 , 只需要在第一个对象创建前初始化 ,
最后一个对象析构后清理即可 ;
没有必要在每个对象中都 执行 网络的初始化 与 清理操作 ;
因此 WSAPrepare 变量被定义成私有静态变量
在 CNetwork 中声明了 CNetwork::WSAPrepare CNetwork::wsaforwin;
确保网络一定会被初始化 , 初始化和析构时 , 不影响网络功能的使用
*/
class WSAPrepare {
public:
WSAPrepare() {
WSADATA data;
memset(&data, 0, sizeof(data));
int ret = WSAStartup(MAKEWORD(2, 2), &data);
if (ret
关注
打赏
热门博文
- 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 )
- 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )
- 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 )
- 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑨ ( 控制 Gradle 执行任务顺序 | Task#finalizedBy 函数 | 控制 Gradle 执行任务顺序示例分析 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑧ ( 控制 Gradle 执行任务顺序 | Task#shouldRunAfter 函数 | 三个函数使用场景对比 )
- 【Android Gradle 插件】自定义 Gradle 任务 ⑦ ( 控制 Gradle 执行任务顺序 | Task#dependsOn 函数 | Task#mustRunAfter 函数 )
- 【数学分析】集合 ① ( 集合概念 | 集合表示 | 常用的数集合 | 集合的表示 )
- 【数学分析】学科简介 ( 初等数学缺陷 | 微分与积分 | 学习数学分析的目的 | 数学分析与高等数学对比 )
- 【Android Gradle 插件】自定义 Gradle 任务 ③ ( Gradle 自定义任务创建方法 Project#task 函数 | Task#doFirst 函数用法 )