简单讲解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;
}