?簡(jiǎn)單講解ACE_SOCK Wrapper Class的使用
Stone Jiang
http://www.shnenglu.com/ace
我們先來(lái)看一個(gè)場(chǎng)景:
您去一家餐館吃飯,這家餐館位置就在水木清華街23號(hào);您得事先知道餐館的位置,從門進(jìn)入,如果你想破墻而入那是不允可的。當(dāng)你進(jìn)門后,餐館會(huì)有一位領(lǐng)位員招呼你,領(lǐng)位員會(huì)安排一個(gè)服務(wù)員為你提供服務(wù)的,你可以向服務(wù)員點(diǎn)菜,或聽取服務(wù)員的推薦。用餐后你離開餐館。
利用ACE SOCK編程,與上館子極其相似。我們來(lái)作一個(gè)對(duì)比。
餐館的位置,嗯,計(jì)算機(jī)上,我們是IP地址,水木清華我們對(duì)應(yīng)的是 smth.org,它的門牌號(hào)呢,對(duì)應(yīng)的是我們的端口地址,在ACE中,我們用ACE_INET_Addr來(lái)表示。
即,
ACE_INET_Addr peer_addr;
peer_addr;.set(23,"smth.org");
我們也可以直接通過(guò)它的帶參數(shù)的構(gòu)造函數(shù)來(lái)聲明和初始化,
ACE_INET_Addr peer_addr(23,"smth.org")
餐館的領(lǐng)位員相當(dāng)于 ACE_SOCK_Acceptor,它被動(dòng)的站在站口等著客戶的到來(lái),您作為客戶,是主動(dòng)端,ACE_SOCK_Connector則是您將在代碼中看到的。
ACE面向連接的網(wǎng)絡(luò)編程,有三個(gè)主要的角色
主動(dòng)端,被動(dòng)端和數(shù)據(jù)交流的通道,即
ACE_SOCK_Acceptor, ACE_SOCK_Connector和ACE_SOCK_Stream
接收和發(fā)送數(shù)據(jù),則通過(guò) ACE_SOCK_Stream::recv(...)和send(...)完成,本例演示了接收時(shí)的調(diào)用。
完成數(shù)據(jù)交互之后,ACE_SOCK_Stream::close()完成斷開連接操作。 這相當(dāng)于買單走人。
注:smth.org:23是水木清華Telnet服務(wù),您還可以通過(guò)
telnet smth.org來(lái)訪問(wèn)。
下面是完整代碼示例 VC 7.1下調(diào)試通過(guò)
//@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;
}