ACE服务端编程2:ACE跨平台之数据类型和宽字符

ACE网络库的主要优势之一就是跨平台,ACE提供了操作系统API和编译器级别的跨平台解决方法,使开发人员不用再去关心操作系统和编译器的差异,但因此也带来了ACE的复杂性。

ACE网络库的组织结构主要分为四层:OS适配层、wrapper facade层、框架层、服务层,其中OS适配层为操作系统API提供了包装函数,保证了系统级的跨平台特性。

而不同的C++编译器在以下方面也有明显的差异:

1、模版;

2、数据类型和宽字符;

3、运行时初始化和关闭;

4、分配堆内存;

以上主要参考自APG里内容,但APG有些过于陈旧,例如其中提到的ACE_OS为了避免编译器不支持命名空间,使用类来实现,而在ACE的新版本中已改为命名空间实现。

本文主要讨论数据类型和宽字符的ACE跨平台解决方式,基于ACE 6.0版本,ACE的编译方法可以参考之前写的http://www.cnblogs.com/ym123/p/4277256.html

数据类型



不同的C++编译器的基本数据不同,通常通过预定义类型来解决此,这也是C++常用技巧。

ACE也定义了常用的基本类型:

ACE_INT8、ACE_INT16、ACE_INT32、ACE_INT64和无符号ACE_UINT8、ACE_UINT16、ACE_UINT32、ACE_UINT64;

同时ACE还提供了SIZEOF的定义,可以方便获得该类型在编译器的长度:

ACE_SIZEOF_LONG、ACE_SIZEOF_INT、ACE_SIZEOF_CHAR...

ACE还提供了大尾和小尾的定义:

ACE_BYTE_ORDER,其值是ACE_BIG_ENDIAN或是ACE_LITTLE_ENDIAN;

如果数据类型的尺寸对你的程序很重要,就不应该依赖编译器的硬件尺寸而是使用这些基础类型,例如常见的确定TCP数据包内容长度的头尺寸,就应该明确长度。

这些类型定义在ace/Basic_Types.h头文件中。

窄字符和宽字符



ACE定义了两个常量:

ACE_HAS_WCHAR 用于启用ACE的宽字符配置;
ACE_USES_WCHAR 用于指示ACE在内部使用宽字符配置。

这两个常量在编译ACE网络库时起作用,如果想使用宽字符,编译ACE时在config.h中输入:

#define ACE_HAS_WCHAR

#define ACE_USE_WCHAR

ACE定义了ACE_TCHAR类型,根据ACE_USES_WCHAR使用char或者wchar_t;

ACE_TEXT(str),根据ACE_USES_WCHAR正确定义字符串文本;

ACE_TEXT_CHAR_TO_TCHAR(str),如果需要,把char * 转换为ACE_TCHAR;

ACE_TEXT_WCHAR_TO_TCHAR(str),如果需要,把wchar_t *转换为ACE_TCHAR;

ACE_TEXT_ALWAYS_CHAR(str),如果需要,把ACE_TCHAR转换为char *;

ACE定义了ACE_CString和ACE_WString类型,存取窄字符串和宽字符串,具体用法与std::string类型相似,定义在ace/SString.h头文件中。

ACE解决其他三个编译器差异的实现在后续博文中讲解。



记录,为更好的自己!

时间: 2024-10-08 15:47:51

ACE服务端编程2:ACE跨平台之数据类型和宽字符的相关文章

ACE服务端编程3:ACE跨平台之分配堆内存

ACE服务端编程系列的第三篇,探究ACE解决不同编译器之间分配堆内存的差异. 在ACE的官方示例中会看到大量的ACE_NEW_RETURN,ACE_NEW这样的宏,这是ACE为了消除不同编译器编译的代码在堆上分配内存失败的行为差异. 具体来说: 使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的C++编程习惯,也是编写可靠服务端程序所必需的. 如果使用 new 分配内存失败时,C++标准的规定是抛出异常,如果想检

ACE服务端编程4:ACE跨平台之运行时初始化和关闭

参考APG里的说法:平台差异及不兼容性的一个特别的方面,是对象的运行时初始化和程序关闭时这些对象的相应析构. ACE为了明确管理对象的清理,定义了ACE_Object_Manager类,这个类不仅涉及到对象的管理,还与ACE库的初始化与关闭相关. ACE中应用了大量的设计模式,本篇顺便研究ACE的程序入口函数替换机制分析. ACE库的初始化与关闭 应用要确保在使用ACE库时正确的初始化和关闭,有以下两种常用方式: 1.使用ACE_TMAIN宏作为程序入口函数: 2.使用ACE::init()和A

ACE服务端编程5:ACE日志输出和跟踪

服务器程序经常需要在命令行中显示错误消息.状态或者用来跟踪程序的执行路径,最简单的方法是使用printf. ACE提供了更强大日志设施: 1.可以在编译时启用或禁用宏: 2.可以动态的启用或禁用宏: 3.支持日志严重级别: 4.支持日志重定向: 5.支持多线程安全和线程级配置: 使用ACE的日志相关功能,需要引入<ace/Log_Msg.h>头文件. ACE日志输出 ACE提供了两个宏来支持日志输出:ACE_DEBUG.ACE_ERROR. 这两个宏的内部实现和行为都是一样,只是为了在语义上区

《Linux多线程服务端编程——使用muduo C++网络库》学习笔记

第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线程的创建和等待结束(join).封装为muduo::Thread 4个:mutex的创建.销毁.加锁.解锁.封装为muduo::MutexLock 5个:条件变量的创建.销毁.等待.通知.广播.muduo::Condition 2.(P85)不推荐使用读写锁的原因是它往往造成提高性能的错觉(允许多个

Linux多线程服务端编程:使用muduo C++网络库

内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这是在Linux下以native语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序.本书以 muduo网络库为例,讲解这种编程模型的使用方法及注意事项.本书的宗旨是贵精不贵多.掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施.掌

java ServerSocket服务端编程

1 public class Test { 2 3 public static void main(String[] args) throws Exception{ 4 5 //1. 构造ServerSocket实例,指定服务端口. 6 ServerSocket servSock = new ServerSocket(); 7 servSock.bind(new InetSocketAddress("192.168.1.35", 8400)); 8 System.out.println

看到一个伙计遇到的服务端编程遇到的问题 赶紧复制过来

游戏类型:ARPG横板格斗过关手机网游,类似王者之剑,DNF. 客户端unity,碰撞判定在客户端,AI和伤害运算在服务端.峰值单服在线2800. netty,protobuf,mysql. 指令设计不合理,粘包时出现异常 原始设计过于简单,没有指令队列和分类的概念.当粘包指令同时执行时,发生串行指令被并行执行的情况. 解决:增加每个角色的指令队列,指令按照队列执行.增加指令的分类:比如序列指令,覆盖指令(后一个可覆盖前一个,比如位置同步指令),用户同步序列指令(比如登录选择角色相关的指令).

select---基于TCP客户/服务端编程

我们先来说说最重要的函数select这个函数,它的原型如下: int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout): select函数可以执行I/O多路转接.传给select的参数告诉内核: 1.我们所关心的描述符 2.对于每个描述符我们所关心的条件(是否想从一个给定的描述符读,写,还是异常条件) 3.愿意等待的时间(永远等待,等待一个给定的时间或者根本不等待

基于UDP的服务端编程

1.创建套接字 sockfd = socke(AF_INET, SOCK_DGRAM) 2.绑定地址 sockfd.bind() 3.消息收发 data, addr = sockfd.recvfrom(buffersize) 功能:接受UDP消息 参数:每次最多接收消息的大小 字节 返回值:data 接收到的内容 addr 消息发送方的地址 sockfd.sendto(data, addr) 功能:UDP消息发送 参数:data 要发送的内容 bytes addr 目标地址 返回:发送字节数 4