?簡單講解ACE_SOCK Wrapper Class的使用
Stone Jianghttp://www.shnenglu.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;
}
//???????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;
}