拼命流血

拼命流血

C++博客 首页 新随笔 联系 聚合 管理
  8 Posts :: 22 Stories :: 3 Comments :: 0 Trackbacks
这个系列,我将把我学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
posted on 2006-02-21 15:33 拼命流血 阅读(191) 评论(0)  编辑 收藏 引用 所属分类: 技术类

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理