ACE的使用-Timmer

以下是第一个ACE的例子,主要用于熟悉ACE的网络编程优势。

功能:客户端连接主机端,主机端给客户端发送当前时间。

 

服务器端程序:

 

#define WIN32
#define _DEBUG

#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/Log_Msg.h"
#include "ace/OS_main.h"
#include "ace/SOCK_Acceptor.h"

#pragma comment(lib,"aced.lib")

using namespace std;

int ACE_TMAIN (int, ACE_TCHAR *[])
{
    ACE_INET_Addr addr(1500);
    ACE_SOCK_ACCEPTOR server;
    ACE_SOCK_STREAM stream;

    if (server.open(addr) == -1)
    {
        ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) %p/n"),ACE_TEXT ("bind failed")));
        return 1;
    }

    char msg[15];

    while (server.accept(stream) != -1)
    {
        ACE_INET_Addr raddr;
        stream.get_remote_addr(raddr);
        ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) connect:%s %d/n"),raddr.get_host_addr(),raddr.get_port_number()));
        time_t nTime=0;
        time( &nTime ) ;
        tm *tm1 = localtime( &nTime ) ;
        sprintf(msg,"%04d%02d%02d%02d%02d%02d",tm1->tm_year+1900,tm1->tm_mon+1,tm1->tm_mday,tm1->tm_hour,tm1->tm_min,tm1->tm_sec);

        stream.send_n(msg,sizeof(msg));
        stream.close();
    }

    server.close();
    return 0;
}

 

 

 

客户端程序,如下:

#define WIN32
#define _DEBUG

#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/Log_Msg.h"
#include "ace/OS_main.h"

#pragma comment(lib,"aced.lib")

using namespace std;



int ACE_TMAIN (int, ACE_TCHAR *[])
{
     ACE_INET_Addr addr(1500,"127.0.0.1");
     ACE_SOCK_CONNECTOR con;
     ACE_SOCK_STREAM stream;

     if (con.connect(stream,addr) == -1)
     {
         ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) %p/n"),ACE_TEXT ("connection failed")));
     }

     const char msg[]="Hello,ACE";
     stream.send_n(msg,sizeof(msg));

     char buffer[1024]={0};
     
     if (stream.recv(buffer,sizeof(buffer)-1) == -1)
     {
         ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) %p/n"),ACE_TEXT ("recv failed")));
         return 1;
     }

     ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) %p/n"),buffer));

     if (stream.close() == -1)
     {
        ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) %p/n"),ACE_TEXT ("close failed")));
        return 1;
     }
     return 0;
}

 

另外一个例子:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值