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

小明思考

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

ACE 示例2 --- Echo Server

Posted on 2006-02-17 15:33 小明 閱讀(7761) 評論(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伊人成综合| 亚洲视频碰碰| 国产一区二区三区四区hd| 葵司免费一区二区三区四区五区| 久久综合给合久久狠狠色| 亚洲毛片一区二区| 翔田千里一区二区| 亚洲精品久久久久久久久久久久| 一本久道久久久| 欧美精品二区| 久久精品视频在线| 一区二区三区高清| 香蕉久久夜色精品| 亚洲精品免费一区二区三区| 亚洲无亚洲人成网站77777 | 一区二区福利| 欧美一区二区三区在线免费观看| 亚洲精品免费看| 欧美在线不卡| 午夜精品久久久久久久白皮肤 | 欧美一区二区三区在线看| 久久精品亚洲国产奇米99| 一区二区三区蜜桃网| 久久综合久久综合久久| 性做久久久久久| 欧美精品尤物在线| 国产一区二区剧情av在线| 欧美激情在线狂野欧美精品| 国产精品网站在线观看| 亚洲美女中出| 日韩午夜激情av| 麻豆久久久9性大片| 久久久www| 国产乱码精品| 一区二区三区回区在观看免费视频| 激情懂色av一区av二区av| 亚洲男人影院| 欧美亚洲自偷自偷| 国产精品日本一区二区| 日韩午夜三级在线| 99在线热播精品免费99热| 欧美成人r级一区二区三区| 麻豆精品视频在线观看| 精品91免费| 亚洲一区日本| 欧美亚洲在线播放| 亚洲欧美视频一区二区三区| 欧美国产一区二区在线观看| 欧美黄色一区| 亚洲精品视频在线| 欧美黄色免费网站| 最新日韩在线视频| 国产日韩欧美在线播放| 亚洲在线播放| 久久本道综合色狠狠五月| 国产女人18毛片水18精品| 亚洲在线观看视频网站| 欧美在线一二三区| 黄色成人在线| 欧美成ee人免费视频| 亚洲娇小video精品| 99在线精品观看| 国产精品久久毛片a| 午夜精品免费视频| 久久久久国产一区二区三区四区| 国产原创一区二区| 久久字幕精品一区| 亚洲国产精品久久久久婷婷884 | 一区二区三区日韩在线观看| 亚洲欧美国产三级| 国内视频一区| 免费中文字幕日韩欧美| 亚洲精品小视频在线观看| 亚洲色图在线视频| 国产农村妇女精品| 欧美v日韩v国产v| 99v久久综合狠狠综合久久| 亚洲欧美精品| 欧美三区在线视频| 亚洲免费在线电影| 国产一区二区久久精品| 麻豆久久婷婷| 亚洲一区网站| 蜜桃久久av| 亚洲无限av看| 樱桃国产成人精品视频| 欧美日韩高清在线观看| 校园激情久久| 亚洲精品在线观看视频| 久久精品夜色噜噜亚洲aⅴ| 亚洲欧洲日产国产综合网| 国产精品久久久亚洲一区| 久久青草久久| 亚洲伊人久久综合| 亚洲第一页自拍| 欧美性做爰猛烈叫床潮| 午夜视频在线观看一区二区| 久久婷婷国产综合尤物精品| 亚洲视频专区在线| 欧美区亚洲区| 亚洲精选大片| 亚洲国产精品一区制服丝袜 | 亚洲麻豆av| 欧美日韩国产美| 性欧美办公室18xxxxhd| 久久国产精品亚洲va麻豆| 欧美激情一级片一区二区| 亚洲免费伊人电影在线观看av| 国内自拍视频一区二区三区 | 欧美大片免费观看| 欧美一区二区免费| 99re成人精品视频| 在线免费精品视频| 国产日韩精品视频一区二区三区| 欧美精品二区三区四区免费看视频| 久久久国产视频91| 性色av一区二区三区在线观看| 日韩午夜电影av| 欧美高清视频一区二区| 久久精品国产久精国产爱| 亚洲图片在线观看| 99re66热这里只有精品4| 亚洲电影在线看| 激情婷婷久久| 国外成人在线视频| 国产精品视频xxxx| 欧美特黄一区| 欧美日韩国产麻豆| 欧美日本国产一区| 欧美精品久久99| 欧美高清视频| 欧美激情亚洲激情| 欧美高清免费| 欧美伦理a级免费电影| 欧美成人午夜激情视频| 久久免费99精品久久久久久| 欧美在线短视频| 久久精品一区二区三区不卡牛牛| 亚洲欧美色婷婷| 亚洲永久精品国产| 性18欧美另类| 久久久久青草大香线综合精品| 欧美一区二区三区四区在线 | 久久精品免费| 欧美一级大片在线免费观看| 亚洲欧美日韩在线高清直播| 亚洲在线不卡| 欧美一区在线视频| 久久精品一区二区国产| 久久久久久久91| 麻豆成人在线观看| 欧美成人在线网站| 欧美日韩一区二区三区| 欧美亚韩一区| 国产亚洲欧美另类一区二区三区| 国产综合香蕉五月婷在线| 在线精品国产欧美| 日韩视频免费观看| aa成人免费视频| 一区二区三区欧美| …久久精品99久久香蕉国产| 中日韩美女免费视频网址在线观看| 91久久久亚洲精品| 欧美日韩小视频| 亚洲欧美日韩一区二区三区在线观看 | 影音先锋亚洲精品| 国产专区一区| 亚洲国产日韩一区| 99在线精品观看| 欧美与欧洲交xxxx免费观看 | 国产日韩一区在线| 国内精品视频久久| 亚洲七七久久综合桃花剧情介绍| 一区二区三区国产精华| 午夜激情综合网| 美女视频黄 久久| 亚洲毛片一区二区| 欧美在线免费看| 欧美精品1区2区| 国模叶桐国产精品一区| 99精品欧美一区二区三区综合在线 | 亚洲亚洲精品三区日韩精品在线视频 | 樱桃国产成人精品视频| 亚洲图片自拍偷拍| 美女免费视频一区| 中文在线一区| 蜜臀久久久99精品久久久久久 | 亚洲精选一区| 久久久久免费| 国产欧亚日韩视频| 99日韩精品| 久久色在线播放| 999亚洲国产精| 久久频这里精品99香蕉| 国产精品视频在线观看| av成人天堂| 亚洲第一久久影院| 欧美一区二区久久久|