Posted on 2006-02-16 17:48
小明 阅读(3596)
评论(4) 编辑 收藏 引用 所属分类:
Network/ACE
这个系列,我将把我学ACE写的一些小程序,放上来跟大家share.
所谓Time Server,很简单,就是用户连上来的时候,返回系统时间。这可能是最简单的server端程序了。
代码:
#ifdef _DEBUG
#pragma comment(lib,"ACED.lib")
#else
#pragma comment(lib,"ACE.lib")
#endif
#include <ace/OS_main.h>
#include <ace/ACE.h>
#include <ace/Log_Msg.h>
#include <ace/SOCK_Acceptor.h>
#include <ctime>
int main(int argc, char *argv[])
{
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()));
//get current time
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;
}
简单的说明一下:
ACE_INET_Addr相当于socket中的sockaddr_in的封装.
ACE_SOCK_Acceptor是服务器端socket操作的封装,相对于客户端的ACE_SOCK_Connector
ACE_SOCK_Stream是对Socket数据的封装,可以把它想象成一个在网络上的数据流。发送数据,接收数据就靠它了。
ACE_DEBUG是ACE提供的Debug机制,会打印信息到控制台
这个程序使用的是单线程,简单的返回时间,然后关闭连接,这对于Time Server是足够的。
至于客户端程序的写法,参见我以前写的: http://www.cppblog.com/sandy/archive/2005/11/24/1281.html