分类 C/C++ 下的文章

定义一个常量

const int bufSize = 512;  // 正确
const int k;  // 错误:k 是一个未经初始化的常量

编译器在编译过程中把用的常量的地方都替换成对应的值。

默认情况下,const 对象仅在文件内有效。当多个文件中出现了同名的 const 常变量时,其实等同于在不同文件中分别定义了独立的常变量。如果想要在文件间共享 const 常变量,解决的办法是,对于 const 变量不管是声明还是定义都添加 extern 关键字。

// file_1.cpp 定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize = fcn();
file_1.h 头文件
extern const int bufSize; // 与 file_1.cpp 中定义的 bufSize 是同一个。

- 阅读剩余部分 -

wchar_t c = 'A';

变量 c 是两个字节的值 0x0041, 是 Unicode 表示的字母 "A"。因 CPU 是从低位字节开始存储多字节数值,估该数据实际是以 0x41、0x00 的顺序保存在记忆体中。

数据类型

  • 基本类型(算数类型,整数,浮点数)
  • 枚举类型
  • void 类型
  • 派生类型

整数类型

类型存储大小
char1 byte
unsigned char1 byte
int2 or 4 bytes
unsigned int2 or 4 bytes
short2 bytes
unsigned short2 bytes
long4 bytes
unsigned long4 bytes

浮点类型

类型存储大小
float4 bytes
double8 bytes
long double10 bytes

void 类型

  • 函数返回为空 void exit (int status);
  • 函数参数为空 int rand(void);
  • 类型为 void 的指针: 类型为 void * 的指针代表对象的地址, 例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

- 阅读剩余部分 -

一、关于 TCP 重定向的实现。

TCP 重定向的实现方法有很多, 有些方法是先强制把原来的 Socket 改为阻塞模型(例如:对于消息模型的,先调WSPAsyncSelect(s, hWnd, 0, 0, err) 取消消息映射;对于事件模型的,先调用 WSPEventSelect(s, 0, 0, err) 取消事件),跟代理服务器握手成功后,再恢复原来的模型;有些方法是使用状态机;而最简单和最流行的方法是:把连接重定向到 127.0.0.1 本地自己程序监听的端口,由该程序来完成握手。之所以需要考虑这些问题,是因为当 connect 函数返回后,原来的程序便开始收发数据了,而 LSP 层还在和代理服务器协商,因为使用的是同一个 socket 句柄,所以这两个过程的数据收发是可能导致数据混乱的。

目前基本上所有 LSP 程序都是使用最后一个方法,因为还有个原因:对于网络游戏,如果你重定向到真正代理服务器,这个过程是可能消耗一定时间的,可能会导致网络游戏认为连接超时而断开连接,把连接重定向到 127.0.0.1 就没事了。

二、关于 UDP 重定向的实现。

UDP 的重定向不像 TCP 仅处理 WSPConnectWSPConnectEX 即可,它涉及到数据的收发,对应的两个函数是:WSPSendtoWSPRecvFrom,我们需要在发送的时候将真正的地址加到原数据头,然后将发送地址改为代理服务器的;在接收返回后,从头数据取出真正服务器的 IP 并去掉该头数据。我们先来看看,如果使用 API HOOK 是如何处理接收函数的:

- 阅读剩余部分 -

采用 LSP 方式进行网络加速需要部署 SOCKS5 代理服务器作为加速节点,加速客户端自动选择最快的代理服务器作为当前的转发节点。

开发人员在客户端需要完成的动作有:

1.编写我们自己的 LSP 协议动态库,重新实现我们需要的相关 socket 函数,如 connect

2.在用户的主机安装我们自己的 LSP 协议,这一操作可以放入我们的应用程序部署的时候完成,也可以在我们的加速器每次启动的时候进行部署;

3.当游戏客户端调用 connect 函数(或 WSAConnect 函数)试图连接游戏服务器时,通过 LSP 将连接重定向到代理服务器,并采用 SOCKS5 协议规范与代理服务器进行数据协商,由代理服务器来连接真正的游戏服务器,并将游戏服务器的数据原封不动转发给用户、同时将用户的数据原封不动转发给游戏服务器。

- 阅读剩余部分 -