ACE网络库学习笔记

ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。

ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

ACE_Message_Queue

ACE消息队列,请参考:

ACE_Message_Block

ACE_Message_Block用于构建“固定”和“可变”长度的消息。ACE_Message_Block可以将多条消息连接在一起,形成一个链表,从而支持复合消息。请参考:

ACE_Thread_Manager

ACE线程管理类,请参考:

ACE日志设施

请参考:

ACE组播通信

请参考:

问题参考

ACE静态链接问题

请参考

ACE TCP Server无法Open的问题

最近突然发现ACE_SOCK_Acceptor.open方法报错,无法初始化,错误代码是10093,通过分析是WSAStartup()未初始化。最后在main函数文件中通过 #include <ace/OS_main.h> 解决。解决原因是该文件中将调用 WSAStartup() 函数初始化。

1
2
3
4
5
ACE_INET_Addr commAddr(1500);
if (m_acceptor->open(commAddr, 1) == -1) {
ACE_DEBUG((LM_ERROR, "errno=%d", ACE_OS::last_error()));
return -1;
}

ACE 多网口多播问题

当多播时存在多个网口,应指定多播绑定的网口。参考如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "ace/SOCK_Dgram_Mcast.h"
#include "ace/Log_Msg.h"

int main()
{
ACE_SOCK_Dgram_Mcast mcast;
ACE_INET_Addr srv_addr("224.0.0.9:520");

/*
if (mcast.open(srv_addr, "eth0", 1) == -1)
{
ACE_ERROR_RETURN((LM_ERROR, "%p"), -1);
}*/

mcast.join(srv_addr,1,"eth0");
}

参考链接

  1. ACE 示例2 — Echo Server,by peirenlei.
  2. ACE自适配通信环境,by wikipedia.
  3. 服务器并发策略,by maodanp.
  4. Threads and Connections in Backend Applications,by Hussein Nasser.
  5. error LNK2019: 无法解析的外部符号 “int __cdecl ace_main_i(int,char * * const)” ,by 金士顿.
  6. Windows Sockets Error Codes,by microsoft.
  7. WSAStartup 函数 (winsock.h),by microsoft.
  8. socket 函数 (winsock2.h),by microsoft.
  9. ACE_SOCK,by 咚咚锵锵.
  10. C++ Winsock 10093 error,by stackoverflow.