Focus on ACE

订阅 ace-china
电子邮件:
浏览存于 groups.google.com 上的所有帖子

C++博客 首页 新随笔 联系 聚合 管理
  64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks

 简单讲解ACE_SOCK Wrapper Class的使用

Stone Jiang
http://www.cppblog.com/ace


我们先来看一个场景:
您去一家餐馆吃饭,这家餐馆位置就在水木清华街23号;您得事先知道餐馆的位置,从门进入,如果你想破墙而入那是不允可的。当你进门后,餐馆会有一位领位员招呼你,领位员会安排一个服务员为你提供服务的,你可以向服务员点菜,或听取服务员的推荐。用餐后你离开餐馆。

利用ACE SOCK编程,与上馆子极其相似。我们来作一个对比。
餐馆的位置,嗯,计算机上,我们是IP地址,水木清华我们对应的是 smth.org,它的门牌号呢,对应的是我们的端口地址,在ACE中,我们用ACE_INET_Addr来表示。
即,
ACE_INET_Addr peer_addr;
peer_addr;.set(23,"smth.org");
我们也可以直接通过它的带参数的构造函数来声明和初始化,
ACE_INET_Addr peer_addr(23,"smth.org")

餐馆的领位员相当于 ACE_SOCK_Acceptor,它被动的站在站口等着客户的到来,您作为客户,是主动端,ACE_SOCK_Connector则是您将在代码中看到的。

ACE面向连接的网络编程,有三个主要的角色
主动端,被动端和数据交流的通道,即
ACE_SOCK_Acceptor, ACE_SOCK_Connector和ACE_SOCK_Stream

接收和发送数据,则通过 ACE_SOCK_Stream::recv(...)和send(...)完成,本例演示了接收时的调用。

完成数据交互之后,ACE_SOCK_Stream::close()完成断开连接操作。 这相当于买单走人。

注:smth.org:23是水木清华Telnet服务,您还可以通过
telnet smth.org来访问。

下面是完整代码示例 VC 7.1下调试通过
//@file: mybrowser.cpp
//       Main function
//@auth: Stone Jiang <2005119@gmail.com>
//@date: 2006-4-20

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


int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
  ACE_DEBUG((LM_DEBUG,
"start here\n"));

  
const char* server_hostname = "smth.org";

  ACE_SOCK_Connector connector;
  ACE_SOCK_Stream peer;
  ACE_INET_Addr peer_addr;
  
char buf[64]={0};

  
if(peer_addr.set(23,server_hostname) == -1)
  {
     ACE_ERROR_RETURN((LM_DEBUG,
"(%P|%t) %p\n",
                 
"Set server host"),-1);

  }
  
else if(connector.connect(peer,peer_addr) == -1)
  {
    ACE_ERROR_RETURN((LM_DEBUG,
"(%P|%t) %p\n",
      
"Connection"),-1);

  }
  ACE_DEBUG((LM_DEBUG,
"建立连接成功 \n"));
  
const int s = 64 * 10;
  
int m = 0;
  
for(ssize_t n; (n = peer.recv(buf,sizeof buf))>0;)
  {
    
    ace::write_n(ACE_STDOUT,buf,n);
    m 
+= n;
    
if( m > s)
    {
      
break;
    }
  }
  peer.close();

  
return 0;
}




posted on 2006-04-20 23:50 Stone Jiang 阅读(1007) 评论(0)  编辑 收藏 引用 所属分类: ACEC++&OOP

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理