以下是第一个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 ) |
|