青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小明思考

高性能服務器端計算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

ACE 示例2 --- Echo Server

Posted on 2006-02-17 15:33 小明 閱讀(7759) 評論(6)  編輯 收藏 引用 所屬分類: Network/ACE
Echo server就是那種提供回顯服務的程序,就是收到什么,然后就發送什么的程序。

兩種實現方法

1.Per client Per Thread (每個連接每個線程來處理)

這種方式比較簡單,易于實現。缺點是如果有大量的連接,必然占用過量的系統資源。

代碼:

#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,當有client連上來的時候,啟動worker thread來處理。
     

2.事件模型
socket里面是有select機制,ACE也提供了這種方式。
概念:
Event_Handler:有事件來臨的時候的處理器
Reactor:事件管理,負責管理Event_Hanlde和分發事件
Acceptor負責連接Event_Handle,Reactor和Sock_Acceptor

代碼:

#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;
}

說明:
1.使用ACE_Acceptor模板類來定義自己的Acceptor
2.ACE_Reactor::instance()->handle_events()來實現事件分發
3.在Event_Handle里面使用reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);來注冊要關心的事件
4.在Event_Handle中使用peer()來獲得Sock_Stream來發送接受數據。

Feedback

# re: ACE 示例2 --- Echo Server  回復  更多評論   

2006-05-26 17:47 by filebat(markfilebat@126.com
寫得不錯, 支持支持!!!
版主,你現在還有沒有弄ACE?

想找你討教一下

# re: ACE 示例2 --- Echo Server  回復  更多評論   

2007-07-22 09:12 by perlman@163.com
例2中,對 if(peer().send_n(buffer,len)<=0)的調用是一個阻塞方法,在這里會阻塞其他事件的發生。在繁忙的情況下會降低服務器的性能,值得商榷。

# re: ACE 示例2 --- Echo Server  回復  更多評論   

2007-12-26 17:04 by 南龍
快速入門,頂!

# re: ACE 示例2 --- Echo Server  回復  更多評論   

2007-12-26 17:32 by 南龍
那里有 ACE 的幫組文件。像 MSDN?

# re: ACE 示例2 --- Echo Server  回復  更多評論   

2011-02-24 19:04 by Grave
I love <a href="http://www.google.com">China</a>!

# re: ACE 示例2 --- Echo Server  回復  更多評論   

2014-01-22 18:19 by asdfadfasfd
<script>alert("fuck the world!");</script>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            怡红院精品视频| 国产亚洲精品高潮| 亚洲另类春色国产| 亚洲区欧美区| 欧美日韩精品免费| 欧美一区二区三区在| 欧美一区午夜精品| 亚洲国产婷婷香蕉久久久久久99 | 午夜精品亚洲| 亚洲成人自拍视频| 欧美高清自拍一区| 亚洲影院免费观看| 欧美在线二区| 亚洲精品无人区| 亚洲视频香蕉人妖| 国产一区二区高清不卡| 免费一级欧美在线大片| 欧美日韩美女在线观看| 欧美与欧洲交xxxx免费观看| 久久久久久亚洲精品不卡4k岛国| 亚洲欧洲在线看| 亚洲一区二区三区在线| 精品1区2区3区4区| 99天天综合性| 亚洲成人原创| 亚洲一区二区免费视频| 91久久精品日日躁夜夜躁欧美| 亚洲精品久久视频| 黑人巨大精品欧美一区二区小视频| 亚洲日本成人网| 狠狠入ady亚洲精品| 99在线精品视频在线观看| 国语自产精品视频在线看| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲欧美在线网| 亚洲乱码国产乱码精品精天堂 | 欧美国产一区二区三区激情无套| 欧美一区二区视频免费观看| 欧美另类亚洲| 欧美激情一区三区| 激情视频一区二区| 亚洲一区二区三区免费视频| a4yy欧美一区二区三区| 久久中文欧美| 麻豆国产va免费精品高清在线| 国产精品美女诱惑| 99视频超级精品| 99re6这里只有精品| 噜噜噜久久亚洲精品国产品小说| 久久精品国产清高在天天线 | 欧美午夜在线视频| 最新成人在线| 亚洲美女福利视频网站| 免费看成人av| 欧美成人自拍| 国产午夜亚洲精品羞羞网站| 亚洲视频在线视频| 99精品热6080yy久久| 嫩草影视亚洲| 亚洲国产成人不卡| 亚洲精品久久久一区二区三区| 久久天堂成人| 亚洲第一级黄色片| 亚洲麻豆av| 欧美三级中文字幕在线观看| 亚洲人成网站在线观看播放| 99国产精品久久久久久久成人热 | 久久激情视频| 欧美 日韩 国产 一区| 亚洲第一精品福利| 欧美激情日韩| 夜夜嗨av一区二区三区网站四季av| 一本色道久久综合亚洲精品高清| 欧美日韩精品高清| 亚洲香蕉视频| 久久男人av资源网站| 在线成人av网站| 欧美激情亚洲激情| 亚洲视频在线观看免费| 久久国产视频网| 亚洲国产精品123| 欧美日韩成人综合在线一区二区| 一区二区电影免费在线观看| 久久成人免费| 亚洲乱码一区二区| 国产精品三上| 久久在线免费视频| 99热在线精品观看| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲韩国青草视频| 欧美午夜电影完整版| 性欧美18~19sex高清播放| 免费观看成人www动漫视频| 日韩视频免费观看高清在线视频| 欧美亚一区二区| 久久久国产成人精品| 亚洲精品日韩激情在线电影 | 亚洲成人自拍视频| 国产精品mv在线观看| 久久精品一区二区三区不卡牛牛| 亚洲国产影院| 欧美一区二区三区在线免费观看| 亚洲国产成人不卡| 国产精品永久免费在线| 欧美wwwwww| 性色av一区二区三区红粉影视| 亚洲高清在线| 卡通动漫国产精品| 亚洲欧美日韩一区二区三区在线| 在线精品观看| 国产无一区二区| 欧美三级小说| 欧美国产在线观看| 久久伊人免费视频| 午夜宅男久久久| 一区二区三区精品| 亚洲国产婷婷香蕉久久久久久| 久久久欧美一区二区| 亚洲嫩草精品久久| 一区二区三区蜜桃网| 亚洲国产精品尤物yw在线观看| 国产一区二区日韩精品| 国产精品久久久久久久久久三级 | 亚洲久久成人| 伊人色综合久久天天| 国产精品免费一区二区三区观看| 欧美电影资源| 欧美aa在线视频| 久久综合亚州| 久久久91精品国产一区二区精品| 亚洲自拍都市欧美小说| 宅男在线国产精品| 一区二区毛片| 一区二区三区日韩| 日韩视频在线一区二区三区| 亚洲人成在线免费观看| 亚洲国产精品久久久久婷婷884 | 99视频超级精品| 中日韩美女免费视频网站在线观看| 亚洲破处大片| 日韩午夜在线观看视频| 亚洲日本欧美日韩高观看| 91久久极品少妇xxxxⅹ软件| 欧美激情一区二区久久久| 亚洲第一区在线观看| 亚洲福利视频一区二区| 亚洲国内自拍| 夜夜爽www精品| 亚洲永久免费精品| 欧美在线观看www| 久久综合五月天婷婷伊人| 欧美成人一区二区三区在线观看| 欧美高清视频在线| 欧美日韩视频在线| 国产精品网红福利| 国产一区二区三区在线免费观看| 国产一区二区三区四区| 91久久精品国产| 亚洲在线观看免费视频| 久久国产精品99国产| 欧美国产免费| a4yy欧美一区二区三区| 亚洲欧美成人在线| 另类av一区二区| 欧美日韩一区二区三区四区在线观看 | 欧美视频久久| 黄色成人在线观看| 日韩午夜高潮| 欧美影院精品一区| 亚洲二区视频| 午夜免费久久久久| 欧美大片一区二区三区| 国产精品人成在线观看免费| 亚洲成色777777女色窝| 亚洲一区二区三区四区五区午夜| 久久精品主播| 日韩视频第一页| 久久精品国产999大香线蕉| 欧美承认网站| 国际精品欧美精品| 亚洲手机视频| 欧美成人一区二免费视频软件| 日韩午夜在线| 免费看成人av| 国产综合久久久久久| 中文精品视频| 欧美高清视频一区二区三区在线观看| 一卡二卡3卡四卡高清精品视频| 久久精品国产亚洲一区二区三区| 欧美日韩一卡二卡| 亚洲日本一区二区三区| 久久久久一区| 亚洲中字黄色| 欧美性猛交xxxx乱大交蜜桃 | 国产亚洲福利一区| 亚洲综合99| 欧美精品在线免费播放| 久久精品亚洲精品| 欧美日韩亚洲不卡| 亚洲国产高清在线观看视频|