C网络编程学习笔记ACE.docx
《C网络编程学习笔记ACE.docx》由会员分享,可在线阅读,更多相关《C网络编程学习笔记ACE.docx(16页珍藏版)》请在冰豆网上搜索。
C网络编程学习笔记ACE
前言
面向对象中间件体系结构
a)主机基础设施中间件:
封装socket,线程等不同主机的实现,形成统一的接口。
如java,ACE
b)分布式中间件:
连接管理,内存管理,整编,解编,端点和请求的多路分离,同步,多线程等,使程序员象开发独立应用程序一样开发分布式应用程序。
分布式中间件的核心是ORB(ObjectRequestsBroker对象请求代理),如:
COM+,JAVARMI,CORBA
1通信设计空间
1.1面向连接协议
需要做出如下设计:
●数据成帧策略
●连接多路复用策略
1.链接多路复用:
多个线程复用同一个TCP链接
2.非多路复用:
多个进程使用多个链接。
系统开销大
1.2同步和异步消息交换
1.3消息传递与共享内存
消息传递:
消息中间件
共享内存:
●本地共享内存:
shmget(),shmat().内存映射文件
●分布式共享内存:
虚拟内存,是本地共享内存的一种抽象。
2SOCKETAPI概述
3ACESocketwrapperfaçade
3.1ACE_Addr
运算符==,!
=
addr_type,addr_size
3.2ACE_INET_Add
3.3ACE_IPC_SAP
为其他ACE对象提供了基本的“I/O”句柄操作能力
enable()
disable()
get_handle()
set_handle()
3.4ACE_SOCK
继承自ACE_IPC_SAP,
get_local_addr()
set_local_addr()
open()
close()
get_remote_addr()
set_option()
get_option()
3.5ACE_SOCK_Connecter
主动连接模式,是一个工厂类。
发起一个连接,并在连接成功后初始化一个ACE_SOCK_Stream对象。
可以通过“阻塞”“非阻塞”“定时”方式发起。
以下是非阻塞模式
以下是非阻塞模式
3.6ACE_SOCK_Stream
数据传输角色的实现。
Send()
Recv()
Send_n()
Recv_n()
Recvv_n()//使用分散读取系统函数,高效、完整读取多个缓冲区,参数iovec[]
Sendv_n()//使用集中写入系统函数,高效、完整写入多个缓冲区
Enable(ACE_NOBLOCK)
3.7ACE_SOCK_Acceptor
被动连接模式的实现。
相当于accept()
是一个工厂类,初始化一个ACE_SOCK_Stream
Open()
Accept()
3.8ACE_Mem_Map
通过内存映射文件机制,将文件映射到内存中,以便及时读取,提高了效率。
此外,内存映射文件还可以被多个进程共享。
4网络日志服务程序的实现
4.1ACE_Message_Block
标准的消息管理包括:
1)收到消息后,保存到缓冲区
2)添加和删除消息的头和尾
3)将消息分段,或重新组装,以适应网络的最大传输单元MCU
4)将消息保存到缓冲区中,以进行传输
5)对“未按顺序”接收的消息进行记录
ACE_Message_Block实现了composite模式。
避免频繁的内存复制操作。
提高效率。
注:
也可以用ACE:
:
write_n(ACE_STDOUT,head)一次性写入
4.2ACE_InputCDR与ACE_OutputCDR
功能:
整编,解编。
避免不同操作系统对数据类型(如int)的不同实现方法。
ACE_OutputCDRheader(ACE_CDR:
:
MAX_ALIGNMENT+userlength)
ACE_OutputCDR:
:
from_boolean(ACE_CDR_BYTE_ORDER)
5并发设计空间
服务器可以分为循环式、并发式和反应式等几大类。
6操作系统的并发机制
7ACE同步事件多路分离
7.1ACE_Handle_Set
7.2ACE_Handle_Set_Iterator
7.3ACE:
:
select()
Set_bit()//将一个句柄放置在set中
领悟到的:
Logging_handler是一个工具对象。
使用他时,先设置一个handle,然后再进行操作。
就像螺丝刀一样。
先指定给一个人,然后这个人才可以操作。
采用ACE_Hash_Map将socket句柄与log_file句柄关联在一起。
从而实现根据socket句柄写相应log_file的功能。
8ACE进程WrapperFaçade
ACE_OS:
:
getenv(“fafaff”)获得环境变量
ACE_Process_Optionsopt;
Omand_line(“%s%d”,”hhafaf”,20);
ACE_Processchild;
Child.spawn(opt);
Child.wait();
Child.exit_code();
9ACE线程WrapperFaçade
9.1ACE_Thread_Manager
创建,管理线程
ACE_Thread_Manager.instance()->spawn()
在执行线程时,为线程动态分配一个属于自己的对象,将对象传递给线程,线程结束时,由线程自身删除这个对象。
ACE_Thread_tme=ACE_OS.thr_self();
ACE_Thread_Manager.instance()->testCancle(me)==false协同式删除
ACE_Thread_Manager.instance()->cancle_all()协同删除由ACE_Thread_Manager创建的所有线程。
可以调用wait()等待。
9.2ACE_Sched_Params
设置线程属性,如优先级,调度策略等
9.3ACE_TSS
实现了“线程专有存储代理”,实现一个每个线程专有的对象。
但这个对象看上去好像是一个全局变量。
比如错误码,所有的线程都需要一个属于自己的错误码。
->操作符,得到和TSS键相关联的线程专有对象
Cleanup()线程结束时,删除TSS对象
在线程内部:
10ACE同步wrapperfaçade
消息队列中信号量的使用:
多个生产者,多个消费者。
刚开始:
notfull=0,notempty=0.不满,也不空。
生产者流程:
Notfull+1。
Notempty-1
消费者流程:
Notempty+1
Notfull-1
卷二
11ACE_Service_Configurator框架
12ACE_Message_Queue
12.1初始化和流控制方法
●Open()初始化队列,设置水位标,设置通知策略
●Hight_warter_mark(),Low_warter_mark()设置/获取流控制何时开始和结束的高低水位标
●Notification_strategy()设置,获取通知策略
12.2入队出对方法和消息缓冲
●Is_empty()
●Is_full()
●Enqueue_head()
●Enqueue_tail()
●Dequeue_head()
●Dequeue_tail()
●Enqueue_prio()根据其优先级来插入队列
13ACE_Task
14Acceptor-Connector框架
14.1ACE_Svc_Handler
继承自ACE_Task,而ACE_Task又继承自ACE_Event_Handler
注意:
close()方法是由每个线程都进行调用的。
该类使用起来非常简单,因为他实现了Task框架和ACE_Event_Handle
14.2ACE_Acceptor类
14.3ACE_Connector类
14.4ACE_Proactor框架
14.5ACE_Proactor类