一直在学习网络编程,今天开始学习ACE库,在学习他之前一直用unix网络编程,写的代码都让我头大死了。
先简单介绍ACE。
ACE(Adaptive Communication Environment)是一个开源的、面向对象的网络框架。它主要由6个框架组成,分别是Acceptor_Connector框架、Service Configurator框架、Stream框架、Task框架、Reactor框架以及Proactor框架。这些框架封装了socket编程的所有API(具体的可以查看这个网站介绍)。
下面是一个简单的利用ACE写的echo服务器代码。
服务端:
#include <ace/SOCK_ACCeptor.h>
#include <ace/INET_Addr.h>
#include <ace/Log_Msg.h>
#include <ace/OS_NS_string.h>
#include <ace/OS_NS_stdlib.h>
#include <cctype>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
ACE_SOCK_ACCEPTOR acc; //定义服务端接收
ACE_INET_Addr addr(6000); //服务端端口地址
if(acc.open(addr)==-1) //socket的listen ,bind封装在open函数内
{
perror("acc.open error");
exit(-1);
}
while (1)
{
ACE_SOCK_STREAM peer; //定义一个流用于输入输出
ACE_INET_Addr cliadr; //定义一个客户端地址
char buf[64];
if (acc.accept(peer,&cliadr)==-1) //socket的accept封装于此
{
perror("acc.accept error");
exit(-1);
}
else
{
int received;
while((received=peer.recv(buf,sizeof(buf))>0))//接收从客户端发送的数据
{
peer.send_n(buf,received); //返回客户端发送的数据
}
peer.close();
}
}
return 0;
}
客户端代码:
#include <ace/SOCK_Connector.h>
#include <ace/INET_Addr.h>
#include <ace/Log_Msg.h>
#include <ace/OS_NS_string.h>
#include <ace/OS_NS_stdlib.h>
#include <cctype>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int ret=0;
const char *ip="192.168.150.171"; //服务端ip
short port=6000; //服务端口号
ACE_INET_Addr sevr(port,ip); //服务端地址
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
ret=connector.connect(peer,sevr);
if (ret<0)
{
perror("connect error");
exit(-1);
}
char in[64];
while(cin.getline(in,sizeof(in))!=NULL) //从界面获得字符串
{
peer.send(in,sizeof(in)); //发送数据
peer.recv(in,sizeof(in)); //接收数据
cout<<in<<endl; //输出数据
}
peer.close();
return 0;
}
代码还是有好多问题,但是可以完全跑通,先整到这。
运行截图: