锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品xxxxx,久久久久九九九,欧美一区二区三区四区高清http://www.shnenglu.com/sandy/category/895.html楂樻ц兘鏈嶅姟鍣ㄧ璁$畻zh-cnMon, 19 May 2008 22:32:12 GMTMon, 19 May 2008 22:32:12 GMT60IOCP Tipshttp://www.shnenglu.com/sandy/archive/2008/03/12/44248.html灝忔槑灝忔槑Wed, 12 Mar 2008 03:51:00 GMThttp://www.shnenglu.com/sandy/archive/2008/03/12/44248.htmlhttp://www.shnenglu.com/sandy/comments/44248.htmlhttp://www.shnenglu.com/sandy/archive/2008/03/12/44248.html#Feedback6http://www.shnenglu.com/sandy/comments/commentRss/44248.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/44248.html闃呰鍏ㄦ枃

灝忔槑 2008-03-12 11:51 鍙戣〃璇勮
]]>
澶氳繘紼嬫湇鍔$瀹炵幇-鍏變韓sockethttp://www.shnenglu.com/sandy/archive/2008/03/10/44080.html灝忔槑灝忔槑Mon, 10 Mar 2008 06:09:00 GMThttp://www.shnenglu.com/sandy/archive/2008/03/10/44080.htmlhttp://www.shnenglu.com/sandy/comments/44080.htmlhttp://www.shnenglu.com/sandy/archive/2008/03/10/44080.html#Feedback1http://www.shnenglu.com/sandy/comments/commentRss/44080.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/44080.html闃呰鍏ㄦ枃

灝忔槑 2008-03-10 14:09 鍙戣〃璇勮
]]>
ACE紺轟緥3 - ACE Proactorhttp://www.shnenglu.com/sandy/archive/2007/06/19/26633.html灝忔槑灝忔槑Tue, 19 Jun 2007 08:31:00 GMThttp://www.shnenglu.com/sandy/archive/2007/06/19/26633.htmlhttp://www.shnenglu.com/sandy/comments/26633.htmlhttp://www.shnenglu.com/sandy/archive/2007/06/19/26633.html#Feedback0http://www.shnenglu.com/sandy/comments/commentRss/26633.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/26633.html闃呰鍏ㄦ枃

灝忔槑 2007-06-19 16:31 鍙戣〃璇勮
]]>
鐢ㄥ畬鎴愮鍙e啓鐨別cho serverhttp://www.shnenglu.com/sandy/archive/2007/06/06/25670.html灝忔槑灝忔槑Wed, 06 Jun 2007 09:44:00 GMThttp://www.shnenglu.com/sandy/archive/2007/06/06/25670.htmlhttp://www.shnenglu.com/sandy/comments/25670.htmlhttp://www.shnenglu.com/sandy/archive/2007/06/06/25670.html#Feedback4http://www.shnenglu.com/sandy/comments/commentRss/25670.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/25670.html闃呰鍏ㄦ枃

灝忔槑 2007-06-06 17:44 鍙戣〃璇勮
]]>
緗戠粶鍖呰繃婊ょ殑瀹炵幇http://www.shnenglu.com/sandy/archive/2006/04/19/5891.html灝忔槑灝忔槑Wed, 19 Apr 2006 08:53:00 GMThttp://www.shnenglu.com/sandy/archive/2006/04/19/5891.htmlhttp://www.shnenglu.com/sandy/comments/5891.htmlhttp://www.shnenglu.com/sandy/archive/2006/04/19/5891.html#Feedback5http://www.shnenglu.com/sandy/comments/commentRss/5891.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/5891.html
鎵浠ユ垜灝辨煡浜嗕竴涓婱SDN,鍙戠幇鏈塕outing and Remote Access Service涓綾葷殑API鍙互鐢ㄣ?br />浜庢槸紼嬪簭鐨勬祦紼嬪氨鏄繖鏍?br />1.璁劇疆涓存椂闃茬伀澧欙紝浠ラ樆鎸″彂鍒扮鍙?1113鐨刄DP鍖?br />2.鍚姩閲戝北璇嶉湼
3.鍒犻櫎璁劇疆

浠g爜錛?br />

#include聽
<stdlib.h>
#include聽
<Iphlpapi.h>
#include聽
<Fltdefs.h>

#pragma聽comment(lib,聽
"Iphlpapi.lib")

constint聽XDICT_PORT聽=11113;

unsigned聽
long聽CharToIp(constchar*sIp)
{
聽聽聽聽
int聽octets[4];
聽聽聽聽
int聽i;
聽聽聽聽
constchar*聽auxCad聽=聽sIp;
聽聽聽聽unsigned聽
long聽lIp聽=0;
聽聽聽聽
聽聽聽聽
//we聽extract聽each聽octet聽of聽the聽ip聽address
聽聽聽聽
//atoi聽will聽get聽characters聽until聽it聽found聽a聽non聽numeric聽character(in聽our聽case聽'.')
聽聽聽聽for(i聽=0;聽i聽<4;聽i++)
聽聽聽聽{
聽聽聽聽聽聽聽聽octets[i]聽
=聽atoi(auxCad);

聽聽聽聽聽聽聽聽
if(octets[i]聽<0||聽octets[i]聽>255)
聽聽聽聽聽聽聽聽聽聽聽聽
return0;

聽聽聽聽聽聽聽聽lIp聽
|=聽(octets[i]聽<<聽(i*8));

聽聽聽聽聽聽聽聽
//update聽auxCad聽to聽point聽to聽the聽next聽octet
聽聽聽聽聽聽聽聽auxCad聽=聽strchr(auxCad,聽'.');

聽聽聽聽聽聽聽聽
if(auxCad聽==聽NULL聽&&聽i!=3)
聽聽聽聽聽聽聽聽聽聽聽聽
return-1;

聽聽聽聽聽聽聽聽auxCad
++;
聽聽聽聽}
聽聽聽聽
return聽lIp;
}

int聽APIENTRY聽WinMain(HINSTANCE聽hInstance,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽HINSTANCE聽hPrevInstance,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽LPSTR聽聽聽聽聽lpCmdLine,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
int聽聽聽聽聽聽聽nCmdShow)
{
聽聽聽聽
//first聽get聽adapter聽info
聽聽聽聽PIP_ADAPTER_INFO聽pAdapterInfo聽=聽NULL,tmp;
聽聽聽聽unsigned聽
long聽len聽=0;
聽聽聽聽聽GetAdaptersInfo(pAdapterInfo,
&len);
聽聽聽聽pAdapterInfo聽
=聽(PIP_ADAPTER_INFO)聽malloc聽(len);
聽聽聽聽DWORD聽result聽
=聽GetAdaptersInfo(pAdapterInfo,聽&len);
聽聽聽聽
if(result!=ERROR_SUCCESS)
聽聽聽聽{
聽聽聽聽聽聽聽聽MessageBox(NULL,
"Fail聽to聽call聽GetAdaptersInfo","ERROR",MB_OK);
聽聽聽聽聽聽聽聽
return-1;
聽聽聽聽}

聽聽聽聽
//create聽filters聽interface
聽聽聽聽INTERFACE_HANDLE聽hInterface聽=聽NULL;
聽聽聽聽result聽
=聽PfCreateInterface(0,PF_ACTION_FORWARD,PF_ACTION_FORWARD,FALSE,TRUE,&hInterface);
聽聽聽聽
if(result!=NO_ERROR)
聽聽聽聽{
聽聽聽聽聽聽聽聽MessageBox(NULL,
"Fail聽to聽call聽PfCreateInterface","ERROR",MB_OK);
聽聽聽聽聽聽聽聽
return-1;
聽聽聽聽}

聽聽聽聽
//add聽the聽filter聽to聽adapter
聽聽聽聽unsigned聽long聽dmp聽=0;
聽聽聽聽PF_FILTER_DESCRIPTOR聽ipFlt;
聽聽聽聽ipFlt.dwFilterFlags聽聽聽聽聽
=0;
聽聽聽聽ipFlt.dwRule聽聽聽聽聽聽聽聽聽聽聽聽
=0;
聽聽聽聽ipFlt.pfatType聽聽聽聽聽聽聽聽聽聽
=聽PF_IPV4;
聽聽聽聽ipFlt.dwProtocol聽聽聽聽聽聽聽聽
=聽FILTER_PROTO_UDP;
聽聽聽聽ipFlt.fLateBound聽聽聽聽聽聽聽聽
=0;
聽聽聽聽ipFlt.wSrcPort聽聽聽聽聽聽聽聽聽聽
=0;
聽聽聽聽ipFlt.wSrcPortHighRange聽
=0;
聽聽聽聽ipFlt.wDstPort聽聽聽聽聽聽聽聽聽聽
=聽XDICT_PORT;
聽聽聽聽ipFlt.wDstPortHighRange聽
=聽XDICT_PORT;
聽聽聽聽ipFlt.SrcAddr聽
=聽(PBYTE)&dmp聽;
聽聽聽聽ipFlt.SrcMask聽
=聽(PBYTE)&dmp;
聽聽聽聽ipFlt.DstAddr聽
=聽(PBYTE)&dmp;
聽聽聽聽ipFlt.DstMask聽
=聽(PBYTE)&dmp;

聽聽聽聽
//bind
聽聽聽聽IP_ADDR_STRING聽*localIp;
聽聽聽聽
for(tmp=pAdapterInfo;tmp聽!=聽NULL;tmp=tmp->Next)
聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽
//聽each聽ip聽of聽a聽adapter
聽聽聽聽聽聽聽聽聽聽聽聽for(localIp=&tmp->IpAddressList;localIp!=NULL;localIp=localIp->Next)
聽聽聽聽聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽unsigned聽
long聽ul聽=聽CharToIp(localIp->IpAddress.String);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽PBYTE聽lIp聽
=聽(PBYTE)&ul;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽PfBindInterfaceToIPAddress(hInterface,聽PF_IPV4,聽lIp);
聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽}

聽聽聽聽result聽
=聽PfAddFiltersToInterface(hInterface,1,&ipFlt,1,&ipFlt,NULL);
聽聽聽聽
if(result!=NO_ERROR)
聽聽聽聽{
聽聽聽聽聽聽聽聽MessageBox(NULL,
"Fail聽to聽call聽PfAddFiltersToInterface","ERROR",MB_OK);
聽聽聽聽聽聽聽聽
return-1;
聽聽聽聽}

聽聽聽聽
//start聽XDict
聽聽聽聽STARTUPINFO聽si;
聽聽聽聽PROCESS_INFORMATION聽pi;
聽聽聽聽ZeroMemory(聽
&si,聽sizeof(si)聽);
聽聽聽聽si.cb聽
=sizeof(si);
聽聽聽聽ZeroMemory(聽
&pi,聽sizeof(pi)聽);
聽聽聽聽::CreateProcess(NULL,
"XDICT.exe",
聽聽聽聽聽聽聽聽NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽
//聽Process聽handle聽not聽inheritable.聽
聽聽聽聽聽聽聽聽NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽//聽Thread聽handle聽not聽inheritable.聽
聽聽聽聽聽聽聽聽FALSE,聽聽聽聽聽聽聽聽聽聽聽聽//聽Set聽handle聽inheritance聽to聽FALSE.聽
聽聽聽聽聽聽聽聽0,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//聽No聽creation聽flags.聽
聽聽聽聽聽聽聽聽NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽//聽Use聽parent's聽environment聽block.聽
聽聽聽聽聽聽聽聽NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽//聽Use聽parent's聽starting聽directory.聽
聽聽聽聽聽聽聽聽&si,聽聽聽聽聽聽聽聽聽聽聽聽聽聽//聽Pointer聽to聽STARTUPINFO聽structure.
聽聽聽聽聽聽聽聽&pi聽);聽聽聽聽聽聽聽聽聽聽聽聽//聽Pointer聽to聽PROCESS_INFORMATION聽structure.

聽聽聽聽
//聽Wait聽until聽child聽process聽exits.
聽聽聽聽WaitForSingleObject(聽pi.hProcess,聽INFINITE聽);
聽聽聽聽
//聽Close聽process聽and聽thread聽handles.聽
聽聽聽聽CloseHandle(聽pi.hProcess聽);
聽聽聽聽CloseHandle(聽pi.hThread聽);


聽聽聽聽
//remove聽filter
聽聽聽聽for(tmp=pAdapterInfo;tmp聽!=聽NULL;tmp=tmp->Next)
聽聽聽聽{
聽聽聽聽聽聽聽聽result聽
=聽PfRemoveFiltersFromInterface(hInterface,1,&ipFlt,1,&ipFlt);
聽聽聽聽聽聽聽聽
if(result!=NO_ERROR)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽MessageBox(NULL,
"Fail聽to聽call聽PfRemoveFiltersFromInterface","ERROR",MB_OK);
聽聽聽聽聽聽聽聽聽聽聽聽
return-1;
聽聽聽聽聽聽聽聽}
聽聽聽聽}
聽聽聽聽PfUnBindInterface(hInterface);聽
聽聽聽聽PfDeleteInterface(hInterface);

聽聽聽聽
//free
聽聽聽聽free(pAdapterInfo);
聽聽聽聽
return0;
}

浣跨敤鐨凙PI鏈?br />GetAdapaterInfo --- 鍙栧緱緗戝崱鐨勪俊鎭紝濡俰p
PfCreateInterface ----Create涓涓狥ilter Interface
PfBindInterfaceToIPAddress ----緇戝畾Filter Interface鍒癐P
PfAddFiltersToInterface ----澧炲姞Filter鍒癐nterface
PfRemoveFiltersFromInterface ---Remove Filter
PfUnBindInterface---鍙栨秷緇戝畾鍒癷p
PfDeleteInterface---鍒犻櫎Filter Interface


闄勪笂鍙墽琛屾枃浠? http://www.shnenglu.com/Files/sandy/XDictWrapper.zip
浣跨敤鐨勬椂鍊欒В鍘嬫斁鍦ㄩ噾灞辮瘝闇稿悓涓涓洰褰曞氨鍙互浜嗭紝鐒跺悗閫氳繃榪欎釜紼嬪簭鏉ュ惎鍔ㄩ噾灞辮瘝闇搞?img src ="http://www.shnenglu.com/sandy/aggbug/5891.html" width = "1" height = "1" />

灝忔槑 2006-04-19 16:53 鍙戣〃璇勮
]]>
[ACE婧愮爜鍒嗘瀽]ACE_Reactor鏄浣曞仛鍒頒簨浠跺垎鍙戠殑http://www.shnenglu.com/sandy/archive/2006/02/23/3451.html灝忔槑灝忔槑Thu, 23 Feb 2006 13:28:00 GMThttp://www.shnenglu.com/sandy/archive/2006/02/23/3451.htmlhttp://www.shnenglu.com/sandy/comments/3451.htmlhttp://www.shnenglu.com/sandy/archive/2006/02/23/3451.html#Feedback2http://www.shnenglu.com/sandy/comments/commentRss/3451.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/3451.htmlctor: ACE_Reactor (ACE_Reactor_Impl *implementation = 0, int delete_implementation = 0);
浣犲彲浠ヨ嚜宸卞垱寤轟竴涓狝CE_Reactor
浣嗘槸澶у鏁版椂鍊欙紝鎴戜滑閮芥槸閫氳繃璋冪敤ACE_Reactor::instance()榪欎釜闈欐佹柟娉曟潵榪斿洖鍞竴鐨勫疄渚嬨?BR>
ACE_Reactor *
ACE_Reactor::instance (
void)
{
  ACE_TRACE (
"ACE_Reactor::instance");

  
if (ACE_Reactor::reactor_ == 0)  //1
    {
      
// Perform Double-Checked Locking Optimization.
      ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
                                
*ACE_Static_Object_Lock::instance (), 0));

      
if (ACE_Reactor::reactor_ == 0) //2
        {
          ACE_NEW_RETURN (ACE_Reactor::reactor_,
                          ACE_Reactor,
                          
0);
          ACE_Reactor::delete_reactor_ 
= 1;
          ACE_REGISTER_FRAMEWORK_COMPONENT(ACE_Reactor, ACE_Reactor::reactor_)
        }
    }
  
return ACE_Reactor::reactor_;
}
娉ㄦ剰榪欑偣浣跨敤浜嗗弻媯嫻嬬殑鏈哄埗(浠g爜1鍜?)錛屼負浜嗘彁楂樻晥鐜囷紝涓嶇敤姣忔閮藉姞閿併?BR>
2. Impl鎵嬫硶鐨勮繍鐢?BR>ACE_Reactor鏈変釜鎴愬憳鍙橀噺 ACE_Reactor_Impl *implementation_;
榪欎釜implementation_鎵嶆槸鐪熸鍋氫簨鎯呯殑涓滆タ錛屽吀鍨嬬殑Impl鎵嬫硶銆?BR>涓轟粈涔堣澶氫竴涓繖涓棿闅斿眰鍛紝涓昏鏄負浜嗗疄鐜拌法騫沖彴銆?BR>鍥犱負涓嶅悓鐨勫鉤鍙扮殑Reactor宸紓寰堝ぇ銆?BR>鍦╓indows騫沖彴錛屽疄鐜拌繖涓槸ACE_WFMO_Reactor
class ACE_Export ACE_WFMO_Reactor : public ACE_Reactor_Impl

3. Event_Handle鐨勭鐞?BR>ACE_WFMO_Reactor鎶婅綆$悊鐨凥andle閮芥斁鍦?ACE_WFMO_Reactor_Handler_Repository handler_rep_;
榪欓噷瑕佹敞鎰忕殑鏄痠o_handle鍜宔vent_handle鐨勫尯鍒?BR>io_handle鏄湡姝g殑handle錛屾瘮濡俿ocket_handle, thread_handle
鑰宔vent_handle鏄粦瀹氬湪io_handle涓婇潰鐨勪簨浠秇andle

鏈変唬鐮佷負璇?
 1 int
 2 ACE_WFMO_Reactor::register_handler_i (ACE_HANDLE event_handle,
 3                                       ACE_HANDLE io_handle,
 4                                       ACE_Event_Handler *event_handler,
 5                                       ACE_Reactor_Mask new_masks)
 6 {
 7   // If this is a Winsock 1 system, the underlying event assignment will
 8   // not work, so don't try. Winsock 1 must use ACE_Select_Reactor for
 9   // reacting to socket activity.
10 
11   // Make sure that the <handle> is valid
12   if (io_handle == ACE_INVALID_HANDLE)
13     io_handle = event_handler->get_handle ();
14 
15   if (this->handler_rep_.invalid_handle (io_handle))
16     {
17       errno = ERROR_INVALID_HANDLE;
18       return -1;
19     }
20 
21   long new_network_events = 0;
22   int delete_event = 0;
23   auto_ptr <ACE_Auto_Event> event;
24 
25   // Look up the repository to see if the <event_handler> is already
26   // there.
27   ACE_Reactor_Mask old_masks;
28   int found = this->handler_rep_.modify_network_events_i (io_handle,
29                                                           new_masks,
30                                                           old_masks,
31                                                           new_network_events,
32                                                           event_handle,
33                                                           delete_event,
34                                                           ACE_Reactor::ADD_MASK);
35 
36   // Check to see if the user passed us a valid event; If not then we
37   // need to create one
38   if (event_handle == ACE_INVALID_HANDLE)
39     {
40       // Note: don't change this since some C++ compilers have
41       // <auto_ptr>s that don't work properly
42       auto_ptr<ACE_Auto_Event> tmp (new ACE_Auto_Event);
43       event = tmp;
44       event_handle = event->handle ();
45       delete_event = 1;
46     }
47 
48   int result = ::WSAEventSelect ((SOCKET) io_handle,
49                                  event_handle,
50                                  new_network_events);

鍙互鐪嬪埌鍦?2琛宑reate event,鍦?4澶嶅埗鍒癳vent_handle,鏈鍚庨氳繃WSAEventSelect灝嗚繖涓猧o_handle鍜宔vent_handle緇戝畾鍦ㄤ竴璧蜂簡

榪欎釜register_handle璋冪敤涓鑸兘鍦‥vent_Handler鐨刼pen鍑芥暟涓紝瀹炵幇浜嗘敞鍐屽埌Reactor涓幓銆?BR>
4. 絳夊緟浜嬩歡
濡備綍媯嫻嬪埌瑕佸彂鐢熺殑socket鐨勪簨浠跺憿錛熸瘮濡傛湁鏂扮殑client榪炴帴錛屾敹鍙戙侫CE騫朵笉鐩存帴璋冪敤select鍑芥暟鏉ュ彇寰椼?BR>ACE璋冪敤WaitForMultipleObjectsEx鏉ョ瓑寰呬簨浠剁殑鍙戠敓銆侫CE榪欐牱鍋氱殑濂藉鏄笉浣嗗彲浠ユ崟鎹塻ocket浜嬩歡錛屼篃鍙互鎹曟崏鍒板叾浠栦簨浠躲傚墠闈㈣榪囦簡姣忎竴涓搴旂殑socket閮芥湁涓涓猠vent_handle涓庝箣瀵瑰簲銆?STRONG>WaitForMultipleObjectsEx浼氬皢鍙戠敓浜嬩歡鐨剆ocket handle鐨刬ndex榪斿洖銆傝繖鏍稟CE_Reactor灝卞彲浠ュ埄鐢ㄨ繖涓猻lot鏉ユ煡鍒癷o_handle鍜宔vent_handler( 娉ㄦ剰:event_handle鍜宔vent_handler鏄笉鍚岀殑)

 1 DWORD
 2 ACE_WFMO_Reactor::wait_for_multiple_events (int timeout,
 3                                             int alertable)
 4 {
 5   // Wait for any of handles_ to be active, or until timeout expires.
 6   // If <alertable> is enabled allow asynchronous completion of
 7   // ReadFile and WriteFile operations.
 8 
 9   return ::WaitForMultipleObjectsEx (this->handler_rep_.max_handlep1 (),
10                                      this->handler_rep_.handles (),
11                                      FALSE,
12                                      timeout,
13                                      alertable);
14 }

5.鍒嗗彂浜嬩歡
鏍規(guī)嵁WaitForMultiObjectEx榪斿洖鐨剆lot灝卞彲浠ユ煡璇㈠埌event_handler鏉ヨ皟鐢ㄧ敤鎴風殑澶勭悊鍑芥暟浜?BR>
 1 int
 2 ACE_WFMO_Reactor::complex_dispatch_handler (DWORD slot,
 3                                             ACE_HANDLE event_handle)
 4 {
 5   // This dispatch is used for I/O entires.
 6 
 7   ACE_WFMO_Reactor_Handler_Repository::Current_Info &current_info =
 8     this->handler_rep_.current_info ()[slot];
 9 
10   WSANETWORKEVENTS events;
11   ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;
12   if (::WSAEnumNetworkEvents ((SOCKET) current_info.io_handle_,
13                               event_handle,
14                               &events) == SOCKET_ERROR)
15     problems = ACE_Event_Handler::ALL_EVENTS_MASK;
16   else
17     {
18       // Prepare for upcalls. Clear the bits from <events> representing
19       // events the handler is not interested in. If there are any left,
20       // do the upcall(s). upcall will replace events.lNetworkEvents
21       // with bits representing any functions that requested a repeat
22       // callback before checking handles again. In this case, continue
23       // to call back unless the handler is unregistered as a result of
24       // one of the upcalls. The way this is written, the upcalls will
25       // keep being done even if one or more upcalls reported problems.
26       // In practice this may turn out not so good, but let's see. If any
27       // problems, please notify Steve Huston <shuston@riverace.com>
28       // before or after you change this code.
29       events.lNetworkEvents &= current_info.network_events_;
30       while (events.lNetworkEvents != 0)
31         {
32           ACE_Event_Handler *event_handler =
33             current_info.event_handler_;
34 
35           int reference_counting_required =
36             event_handler->reference_counting_policy ().value () ==
37             ACE_Event_Handler::Reference_Counting_Policy::ENABLED;
38 
39           // Call add_reference() if needed.
40           if (reference_counting_required)
41             {
42               event_handler->add_reference ();
43             }
44 
45           // Upcall
46           problems |= this->upcall (current_info.event_handler_,
47                                     current_info.io_handle_,
48                                     events);
49 
50           // Call remove_reference() if needed.
51           if (reference_counting_required)
52             {
53               event_handler->remove_reference ();
54             }
55 
56           if (this->handler_rep_.scheduled_for_deletion (slot))
57             break;
58         }
59     }
60 
61   if (problems != ACE_Event_Handler::NULL_MASK
62       && !this->handler_rep_.scheduled_for_deletion (slot)  )
63     this->handler_rep_.unbind (event_handle, problems);
64 
65   return 0;
66 }

榪欓噷鍊煎緱娉ㄦ剰鐨勬槸ACE閫氳繃璋冪敤WSAEnumNetworkEvents鏉ラ噸緗甧vent_handle銆?BR>
璁茬殑姣旇緝姒傝錛屾洿鍏蜂綋鐨勭粏鑺傝鑷繁闃呰婧愮爜銆?BR>鍏充簬ACE_Reactor鐨勭敤娉曡鍙傝鍓嶄竴綃囨垜鐨勭ず渚嬨?BR>



灝忔槑 2006-02-23 21:28 鍙戣〃璇勮
]]>
ACE 紺轟緥2 --- Echo Serverhttp://www.shnenglu.com/sandy/archive/2006/02/17/3308.html灝忔槑灝忔槑Fri, 17 Feb 2006 07:33:00 GMThttp://www.shnenglu.com/sandy/archive/2006/02/17/3308.htmlhttp://www.shnenglu.com/sandy/comments/3308.htmlhttp://www.shnenglu.com/sandy/archive/2006/02/17/3308.html#Feedback4http://www.shnenglu.com/sandy/comments/commentRss/3308.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/3308.html
涓ょ瀹炵幇鏂規(guī)硶

1.Per client Per Thread (姣忎釜榪炴帴姣忎釜綰跨▼鏉ュ鐞?

榪欑鏂瑰紡姣旇緝綆鍗曪紝鏄撲簬瀹炵幇銆傜己鐐規(guī)槸濡傛灉鏈夊ぇ閲忕殑榪炴帴錛屽繀鐒跺崰鐢ㄨ繃閲忕殑緋葷粺璧勬簮銆?BR>
浠g爜:

#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 
<ace/Thread.h>

DWORD worker(
void *arg)
{
    ACE_SOCK_Stream 
*pStream =(ACE_SOCK_Stream *) arg;

    
char buffer[32= {0};

    
int len;

    
while( (len = pStream->recv(buffer,sizeof(buffer)-1)) >0)
    {
        
if(pStream->send_n(buffer,len)<=0)
        {
            ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (
"(%P|%t) %p\n"),
            ACE_TEXT (
"send failed")));
            
break;
        }
    }
    
    ACE_INET_Addr raddr;
    pStream
->get_remote_addr(raddr);
    ACE_DEBUG ((LM_DEBUG,ACE_TEXT (
"(%P|%t) close:%s %d\n"),raddr.get_host_addr(),raddr.get_port_number()));

    pStream
->close();
    delete pStream;
    
return 0;
}

int main(int argc, char *argv[])
{
    ACE_INET_Addr addr(
1500);
    ACE_SOCK_Acceptor server;

    
if(server.open(addr)==-1)
    {
        ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (
"(%P|%t) %p\n"),
            ACE_TEXT (
"bind failed")));
        
return 1;
    }

    ACE_SOCK_Stream 
*pStream = 0
    
while((pStream =new ACE_SOCK_Stream()) &&  server.accept(*pStream)!=-1)
    {
        ACE_INET_Addr raddr;
        pStream
->get_remote_addr(raddr);
        ACE_DEBUG ((LM_DEBUG,ACE_TEXT (
"(%P|%t) connect:%s %d\n"),raddr.get_host_addr(),raddr.get_port_number()));
        ACE_Thread::spawn(worker,pStream);
    }

    server.close();
    
return 0;
}

璇存槑:
      ACE_Thread鐢ㄦ潵鍚姩thread錛屽綋鏈塩lient榪炰笂鏉ョ殑鏃跺欙紝鍚姩worker thread鏉ュ鐞嗐?BR>     

2.浜嬩歡妯″瀷
socket閲岄潰鏄湁select鏈哄埗錛孉CE涔熸彁渚涗簡榪欑鏂瑰紡銆?BR>姒傚康:
Event_Handler:鏈変簨浠舵潵涓寸殑鏃跺欑殑澶勭悊鍣?BR>Reactor:浜嬩歡綆$悊錛岃礋璐g鐞咵vent_Hanlde鍜屽垎鍙戜簨浠?BR>Acceptor璐熻矗榪炴帴Event_Handle,Reactor鍜孲ock_Acceptor

浠g爜:

#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/Svc_Handler.h>
#include 
<ace/Acceptor.h>
#include 
<ace/Log_Msg.h>
#include 
<ace/SOCK_Acceptor.h>
#include 
<ace/Thread.h>

class My_Svc_Handler:
    
public ACE_Svc_Handler <ACE_SOCK_STREAM,ACE_NULL_SYNCH>
{
public:
    
int open(void*)
    {
        ACE_INET_Addr raddr;
        peer().get_remote_addr(raddr);
        ACE_DEBUG ((LM_DEBUG,ACE_TEXT (
"(%P|%t) connect:%s %d %d\n"),raddr.get_host_addr(),raddr.get_port_number(),this));

        reactor()
->register_handler(this,ACE_Event_Handler::READ_MASK);    
        
return 0;
    }

    
int handle_input(ACE_HANDLE)
    {
        
char buffer[32= {0};
        
int len = peer().recv(buffer,sizeof(buffer)-1);
        
if(len>0)
        {
            
if(peer().send_n(buffer,len)<=0)
            {
                ACE_DEBUG ((LM_DEBUG,
                    ACE_TEXT (
"(%P|%t) %p\n"),
                    ACE_TEXT (
"send failed")));
                
return -1//must return -1 to call handle_close
            }
            
return 0;
        }
        
else
        {
            
return -1//must return -1 to call handle_close
        }
    }

    
int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask)
    {
        ACE_INET_Addr raddr;
        peer().get_remote_addr(raddr);
        ACE_DEBUG ((LM_DEBUG,ACE_TEXT (
"(%P|%t) close:%s %d\n"),raddr.get_host_addr(),raddr.get_port_number()));
        peer().close();
        
return 0;
    }
};

typedef ACE_Acceptor
<My_Svc_Handler,ACE_SOCK_ACCEPTOR> MyAcceptor;
int main(int argc, char *argv[])
{
    ACE_INET_Addr addr(
1500);
    MyAcceptor server;

    
if(server.open(addr)==-1)
    {
        ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (
"(%P|%t) %p\n"),
            ACE_TEXT (
"bind failed")));
        
return 1;
    }

    
while(1){
        ACE_Reactor::instance()
->handle_events();
    }
    server.close();
    
return 0;
}

璇存槑錛?BR>1.浣跨敤ACE_Acceptor妯℃澘綾繪潵瀹氫箟鑷繁鐨凙cceptor
2.ACE_Reactor::instance()->handle_events()鏉ュ疄鐜頒簨浠跺垎鍙?BR>3.鍦‥vent_Handle閲岄潰浣跨敤reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);鏉ユ敞鍐岃鍏沖績鐨勪簨浠?BR>4.鍦‥vent_Handle涓嬌鐢╬eer()鏉ヨ幏寰桽ock_Stream鏉ュ彂閫佹帴鍙楁暟鎹?BR>


灝忔槑 2006-02-17 15:33 鍙戣〃璇勮
]]>
ACE 紺轟緥1 --- Time Serverhttp://www.shnenglu.com/sandy/archive/2006/02/16/3293.html灝忔槑灝忔槑Thu, 16 Feb 2006 09:48:00 GMThttp://www.shnenglu.com/sandy/archive/2006/02/16/3293.htmlhttp://www.shnenglu.com/sandy/comments/3293.htmlhttp://www.shnenglu.com/sandy/archive/2006/02/16/3293.html#Feedback3http://www.shnenglu.com/sandy/comments/commentRss/3293.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/3293.html闃呰鍏ㄦ枃

灝忔槑 2006-02-16 17:48 鍙戣〃璇勮
]]>
ACE Beginnerhttp://www.shnenglu.com/sandy/archive/2005/11/24/1281.html灝忔槑灝忔槑Thu, 24 Nov 2005 03:28:00 GMThttp://www.shnenglu.com/sandy/archive/2005/11/24/1281.htmlhttp://www.shnenglu.com/sandy/comments/1281.htmlhttp://www.shnenglu.com/sandy/archive/2005/11/24/1281.html#Feedback8http://www.shnenglu.com/sandy/comments/commentRss/1281.htmlhttp://www.shnenglu.com/sandy/services/trackbacks/1281.html1.download ACE from: www.cs.wustl.edu/~schmidt/ACE.html

2.build ACE in Visual Studio,generate ACE.lib(dll)[for release] & ACEd.lib(dll)[for debug]

3.create a empty project named: ACETest

4.add ACE path into Project Include Path and add ACE/lib into project lib path

5.create a file(hello.cpp)

#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_Connector.h>

int main(int argc, char *argv[])
{
 ACE_INET_Addr addr(
1500,"127.0.0.1"); //remote address
 ACE_SOCK_Connector con; // connetor for socket client
 ACE_SOCK_Stream stream; // stream is for socket read/write

 
if(con.connect(stream,addr)==-1//connect to remote address
 {
  ACE_DEBUG ((LM_DEBUG,
   ACE_TEXT (
"(%P|%t) %p\n"),
   ACE_TEXT (
"connection failed")));
  
return 1;
 }

 
const char msg[] = "Hello,ACE!";

 stream.send_n(msg,
sizeof(msg)); // send_n function send exactly n bytes

 
char buffer[1024= {0};

 
if(stream.recv(buffer,sizeof(buffer)-1)==-1// just call socket recv
 {
  ACE_DEBUG ((LM_DEBUG,
   ACE_TEXT (
"(%P|%t) %p\n"),
   ACE_TEXT (
"recv failed")));
  
return 1;
 }
 ACE_DEBUG ((LM_DEBUG,
  ACE_TEXT (
"(%P|%t) recv:%s\n"),
  buffer));

 
if (stream.close () == -1//close the connection
 {
  ACE_ERROR ((LM_ERROR,
   ACE_TEXT (
"(%P|%t) %p\n"),
   ACE_TEXT (
"close")));
  
return 1;
 }

 
return 0;
}



6.build & execute



灝忔槑 2005-11-24 11:28 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合色一综合色88| 国产一区二三区| 亚洲精品美女久久7777777| 亚洲成人直播| 欧美激情导航| 亚洲一区欧美一区| 午夜精品亚洲| 免费日韩精品中文字幕视频在线| 午夜欧美精品| 午夜宅男久久久| 激情欧美一区二区三区| 欧美.com| 欧美视频在线免费看| 久久av一区二区三区漫画| 欧美在线视频不卡| 日韩写真视频在线观看| 亚洲午夜成aⅴ人片| 悠悠资源网亚洲青| 亚洲精品在线观| 狠狠色丁香久久婷婷综合_中| 亚洲电影成人| 国产嫩草一区二区三区在线观看| 美女黄色成人网| 欧美精品999| 欧美精品一区二区三区视频| 国内精品一区二区三区| 亚洲成人自拍视频| 国产嫩草一区二区三区在线观看| 欧美国产高潮xxxx1819| 国产精品毛片在线看| 亚洲高清视频在线| 国产视频欧美视频| 一区二区欧美在线| 亚洲欧洲精品一区二区三区波多野1战4| 一本久道久久综合狠狠爱| 在线国产日韩| 欧美一区二区免费观在线| 亚洲视频精品| 国产精品麻豆成人av电影艾秋| 久久国产福利| 国产情侣一区| 亚洲精品男同| 在线观看日韩www视频免费| 亚洲在线观看免费| 亚洲午夜一区二区三区| 欧美高清在线播放| 欧美成人免费一级人片100| 国产一区美女| 欧美一区二区三区久久精品茉莉花 | 久久久久国内| 国产欧美一区二区精品仙草咪 | 亚洲视频视频在线| av成人天堂| 美女视频黄 久久| 一区二区精品在线| 国产精品美女一区二区在线观看 | 一区电影在线观看| 欧美不卡高清| 亚洲国产一区二区精品专区| 激情视频一区二区| 久久久之久亚州精品露出| 久久久久久夜| 黄色成人免费观看| 久久性色av| 欧美激情一区二区| 亚洲欧洲精品一区二区三区| 欧美福利精品| 亚洲乱码国产乱码精品精可以看| 91久久视频| 欧美精品一区二区精品网| 亚洲精品在线视频| 亚洲一区在线播放| 久久综合激情| 欧美激情亚洲| 欧美一区二区三区免费视| 国产精品国产成人国产三级| 亚洲免费观看高清在线观看 | 国产拍揄自揄精品视频麻豆| 一区二区三区视频在线观看| 中文av字幕一区| 国产精品久久久对白| 亚洲免费在线视频一区 二区| 久久成人免费网| 在线观看日韩av电影| 欧美精品成人一区二区在线观看 | 久久久美女艺术照精彩视频福利播放| 国产综合精品一区| 欧美国产精品中文字幕| 一区二区欧美视频| 久久久亚洲精品一区二区三区| 亚洲国产精品高清久久久| 亚洲夜晚福利在线观看| 久久精品亚洲国产奇米99| 美女国产一区| 一区二区三区回区在观看免费视频| 欧美色精品在线视频| 香港久久久电影| 欧美高潮视频| 亚洲一区二区三区精品动漫| 国产一区二区三区电影在线观看| 麻豆精品在线观看| 亚洲性夜色噜噜噜7777| 欧美激情精品久久久久久| 午夜国产精品视频| 91久久久国产精品| 国产情侣久久| 欧美三级在线视频| 麻豆久久久9性大片| 午夜精彩视频在线观看不卡| 欧美激情欧美激情在线五月| 欧美一区二区在线免费播放| 亚洲精品在线免费观看视频| 国产一区视频在线看| 国产精品嫩草影院av蜜臀| 欧美成人午夜| 久久久久综合网| 欧美一级成年大片在线观看| avtt综合网| 亚洲国产一区二区三区在线播| 久久人91精品久久久久久不卡| 亚洲视频网在线直播| 99精品国产99久久久久久福利| 精品999网站| 国产亚洲精品v| 欧美在线观看视频| 国产精品―色哟哟| 欧美专区日韩专区| 99ri日韩精品视频| 亚洲国产日韩欧美在线99| 久久噜噜亚洲综合| 性欧美大战久久久久久久久| 在线视频精品一| 一区二区激情| 一区二区三区国产在线| 99re热这里只有精品免费视频| 亚洲激情欧美激情| 亚洲国内精品| 亚洲精品久久久久| 999亚洲国产精| 亚洲伦理一区| 夜夜嗨av一区二区三区中文字幕| 亚洲人成高清| 亚洲美女尤物影院| 在线一区观看| 亚洲欧美日韩国产一区二区三区 | 亚洲国内精品在线| 欧美激情第五页| 亚洲第一精品夜夜躁人人爽| 亚洲夫妻自拍| 亚洲精品美女久久久久| 日韩视频中文字幕| 亚洲小少妇裸体bbw| 亚洲免费综合| 久久久午夜视频| 欧美精品18+| 国产精品免费一区豆花| 国产一二精品视频| 最新高清无码专区| 亚洲一区久久久| 久久国产精品一区二区三区| 久久综合激情| 亚洲毛片一区| 欧美亚洲视频| 亚洲国产视频直播| 久久精品欧美| 欧美一区三区二区在线观看| 欧美一区二区观看视频| 久久久久久自在自线| 欧美成人精品不卡视频在线观看| 亚洲国产精品va| 亚洲男人的天堂在线| 久久人人爽国产| 国产精品久久久久久久久免费| 国产一区二区黄| 亚洲美女av黄| 久久精品最新地址| 亚洲精品国精品久久99热一| 亚洲欧美综合另类中字| 欧美国产在线电影| 国产一区二区av| 亚洲午夜激情免费视频| 欧美freesex交免费视频| 一区二区91| 老牛嫩草一区二区三区日本| 国产精品女人网站| 亚洲久久成人| 毛片一区二区三区| 亚洲综合精品| 欧美日韩www| 亚洲福利在线视频| 久久精品视频免费播放| 99精品国产一区二区青青牛奶| 久久免费视频观看| 国产一区二区三区久久久| 亚洲私人黄色宅男| 亚洲国产精品免费| 久久一区视频| 国模精品一区二区三区| 欧美影院一区| 亚洲一区二区三区乱码aⅴ|