ACE中网络通讯编程基本架构

来源:互联网 发布:晋中教育网网络教研 编辑:程序博客网 时间:2024/05/23 21:25
 ACE中网络通讯编程基本架构  
ACE_Addr是所有ACE"地址"类的基类;
如TCP/IP和UDP/IP的地址信息是用ACE_INET_Addr来表示的方法说明
ACE_INET_ADDr(),Set() 通过主机名、IP地址和端口号初始化ACE_INET_ADDr
string_to_addr()               将字符串转换为ACE_INET_Addr
addr_to_string()               将ACE_INET_Addr转换为字符串
get_port_number()              返回端口号
get_host_name()                返回主机名
使用ACE_INET_ADDr类,可以避免使用原始sock_addr结构所带来的麻烦。    

    ACE_INET_Addr类,包装了网络地址
    ACE_SOCK_Connector类,扮演主动连接角色,发起通讯连接。连接到远端的服务。
    ACE_SOCK_Acceptor类,扮演被动连接角色,等待连接。等待远端客户的请求。
    ACE_SOCK_Stream类,扮演数据通讯角色,发送和接收数据。完成客户与服务之间的通讯。

    利用ACE库来开发网络通讯程序是很简单的,一个基本程序只用到以上提到的几个类,就可以完成一个基于客户端、服务器端模型的网络应用的开发。开发者无需了解Socket在不同平台上的实现,记忆众多并相互关联的Socket APIs。    
  以下以一个Hello World程序为演示。

    客户端程序。发送一个Hello World到远端的服务器,并接收服务器返回的信息,将信息
打印在屏幕上。
#include <iostream>

#include <string>
#include <ace/ACE.h>

#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/SOCK_Stream.h>
int main( int argc, char* argv[] )

{
ACE::init();//初始化ACE库,在windows下一定要
std::string str = "hello world";
//设置服务器地址

//第一个参数是端口,第二个是ip地址,也可以是域名。
//可以先定义一个地址对象,再用ACE_INET_Addr的set函数来设定。
//地址的配置很多,具体的参照文档
ACE_INET_Addr peer_addr( 5050, "127.0.0.1" );
ACE_SOCK_Stream peer_stream;//定义一个通讯队形
ACE_SOCK_Connector peer_connector;//定义一个主动连接对象

peer_connector.connect( peer_stream, peer_addr );//发起一个连接
peer_stream.send( str.c_str(), str.length() );//发送数据到服务器
str.erase();

str.resize( sizeof( "hello world" ) );
peer_stream.recv( (void*)str.c_str(), str.length() );//接收来自服务器的信息
std::cout << "from server message : " << str << std::endl;
    ACE::fini();

return 0;
}
    服务器端代码。接收一个远端的连接,将接收到的信息打印在屏幕上,并将接收到的信

息返回给客户端。
#include <iostream>
#include <string>
#include <ace/ACE.h>

#include <ace/SOCK_Acceptor.h>
#include <ace/SOCK_Stream.h>
int main( int argc, char* argv[] )

{
ACE::init();
std::string str;

str.resize( sizeof( "hello world" ) );
//设置服务器地址

ACE_INET_Addr peer_addr( 5050, "127.0.0.1" );
ACE_SOCK_Stream peer_stream;


//创建被动连接角色对象
ACE_SOCK_Acceptor peer_acceptor;
//开启被动连接对象,将对象绑定到一个地址上
peer_acceptor.open( peer_addr );
//等待连接

peer_acceptor.accept( peer_stream );
//数据通讯

peer_stream.recv( (void*)str.c_str(), str.length() );
std::cout << "from client message : " << str << std::endl;
peer_stream.send( str.c_str(), str.length() );
ACE::fini();

return 0;
}
××××以上代码需要ACE库才能运转××××

    利用ACE编程的基本框架。
    客户端
    1 创建地址对象。(ACE_INET_Addr)
    2 创建主动连接对象。(ACE_SOCK_Connector)
    3 创建数据通讯对象。(ACE_SOCK_Stream)
    4 设置服务器地址。(ACE_INET_Addr::set)
    5 将数据通讯对象和地址作为参数传给主动连接对象,发起主动连接(ACE_SOCK_Connector::connect)
    6 利用通讯对象接收和发送数据。(ACE_SOCK_Stream::recv和ACE_SOCK_Stream::send)

    服务器端
    1 创建地址对象。(ACE_INET_Addr)
    2 创建被动连接对象。(ACE_SOCK_Connector)
    3 创建数据通讯对象。(ACE_SOCK_Stream)
    4 设置服务器地址。(ACE_INET_Addr::set)
    5 将地址作为参数传给被动连接对象,启动接收(ACE_SOCK_Acceptor::open)
    6 将数据通讯对象传给被动连接对象,启动接收,接受连接(ACE_SOCK_Connector::accept)
    7 利用通讯对象接收和发送数据。(ACE_SOCK_Stream::recv和ACE_SOCK_Stream::send)

原创粉丝点击