文章目录
前言
一、开发前的配置 ( 头文件 | 编译参数设置 )
二、网络初始化 WSAStartup 与清理 WSACleanup 操作
前言
本篇博客重点分析 CNetwork 网络模块 ;
一、开发前的配置 ( 头文件 | 编译参数设置 )
Windows 中引入网络套接字头文件注意事项 : 必须先引入 WinSock2.h 头文件 , 然后 再引入 Windows.h 头文件 , 否则会报错 ;
#include <WinSock2.h> // WinSock2.h 头文件 必须在 Windows.h 头文件前面 #include <Windows.h> // 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> // WinSock2.h 头文件 必须在 Windows.h 头文件前面 #include <Windows.h> // Windows.h 头文件 必须在 WinSock2.h 头文件后面 #include <SDKDDKVer.h> #include <afxwin.h> #include <stdio.h> #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 < 0) { printf("网络初始化失败:%s\n", (LPCSTR)CNetwork::GetErrorString()); (void)getchar(); abort(); } } ~WSAPrepare() { if (WSACleanup() < 0) { printf("网络关闭失败:%s\n", (LPCSTR)CNetwork::GetErrorString()); } } }; /* 私有静态成员变量 , 所有的 CNetwork 对象都共享同一个变量 */ static WSAPrepare wsaforwin; };