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

小明思考

高性能服務器端計算
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>
            国产精品色一区二区三区| 亚洲精品久久久久久一区二区| 日韩亚洲在线| 亚洲另类在线视频| 一区二区激情| 亚洲素人在线| 久久九九免费| 91久久精品一区二区别| 蜜臀99久久精品久久久久久软件| 欧美顶级大胆免费视频| 亚洲精品免费观看| 午夜激情综合网| 免费观看日韩av| 国产精品久久久久久久久借妻 | 久久综合综合久久综合| 欧美女人交a| 国产女人精品视频| 最新日韩在线视频| 小黄鸭精品aⅴ导航网站入口| 噜噜噜91成人网| 亚洲深夜av| 久久免费国产精品1| 欧美日韩国产123区| 黄色成人在线网址| 亚洲五月六月| 亚洲第一二三四五区| 午夜精品久久久久久久| 欧美精品性视频| 一区二区三区我不卡| 午夜在线观看欧美| 亚洲精品国产精品国自产在线 | 免费观看日韩| 亚洲在线成人| 欧美日韩成人| 亚洲国产精品嫩草影院| 久久成人精品| 香蕉国产精品偷在线观看不卡| 国产欧美一区二区色老头| 国产日韩一级二级三级| 一区二区三区在线不卡| 亚洲最黄网站| 欧美成人精品激情在线观看| 亚洲日本国产| 久久综合久久88| 久久国产精品久久精品国产| 亚洲午夜女主播在线直播| 欧美亚洲午夜视频在线观看| 欧美激情视频一区二区三区免费| 亚洲在线观看免费视频| 亚洲五月婷婷| 亚洲欧美变态国产另类| 日韩一级视频免费观看在线| 麻豆成人在线| 久久综合精品一区| 激情成人亚洲| 国产午夜精品理论片a级探花| 日韩亚洲精品电影| 一本综合久久| 一二美女精品欧洲| 加勒比av一区二区| 亚洲国产精品v| 麻豆成人在线| 美女日韩欧美| 亚洲精品国精品久久99热| 久久野战av| 欧美大片一区| 亚洲成色精品| 午夜日韩福利| 亚洲人妖在线| 亚洲福利视频在线| 欧美激情按摩在线| 免费观看不卡av| 亚洲日本成人在线观看| 久久一区中文字幕| 欧美另类变人与禽xxxxx| 午夜视频在线观看一区| 午夜精品免费在线| 亚洲精品影视在线观看| 久久成人人人人精品欧| 国产精品99久久99久久久二8 | 免费h精品视频在线播放| 久久夜色精品亚洲噜噜国产mv| 亚洲国产精品久久久久| 91久久精品一区| 国产精品美女久久福利网站| 久久久久国产免费免费| 女人色偷偷aa久久天堂| 亚洲夜间福利| 欧美在线观看视频在线| 91久久精品美女| 亚洲自拍偷拍麻豆| 亚洲黄色视屏| 午夜激情久久久| 亚洲精品一区久久久久久| 亚洲视频你懂的| 亚洲国产精品女人久久久| 亚洲一级黄色片| 亚洲人成网站精品片在线观看 | 亚洲高清123| 一本色道久久99精品综合| 极品尤物久久久av免费看| 99国产麻豆精品| 亚洲日韩欧美一区二区在线| 亚洲欧美区自拍先锋| 99热在这里有精品免费| 久久精品国产精品亚洲综合| 亚洲素人在线| 欧美 日韩 国产在线| 久久国产精品久久久久久久久久| 欧美成人免费小视频| 久久性天堂网| 国产精品香蕉在线观看| 亚洲人成在线影院| 在线观看精品一区| 午夜精品偷拍| 亚洲综合电影一区二区三区| 欧美成人资源网| 看欧美日韩国产| 亚洲美女av在线播放| 久久成人av少妇免费| 亚洲天堂第二页| 另类亚洲自拍| 久久一本综合频道| 国产婷婷成人久久av免费高清| 日韩一级免费观看| 99热在这里有精品免费| 欧美大片免费看| 亚洲高清网站| 亚洲日韩欧美视频一区| 欧美xart系列在线观看| 免费在线视频一区| 在线观看成人av电影| 久久精品国内一区二区三区| 久久久久久网| 永久域名在线精品| 久久久噜噜噜久久人人看| 久久尤物视频| 亚洲国产国产亚洲一二三| 久久最新视频| 亚洲国产另类 国产精品国产免费| 在线精品视频在线观看高清| 久久综合中文字幕| 亚洲高清在线| 中国成人黄色视屏| 国产精品久久久久9999| 亚洲一级特黄| 老司机亚洲精品| 亚洲国产精品久久| 欧美精品v日韩精品v国产精品| 91久久黄色| 亚洲综合国产| 国模大胆一区二区三区| 久久综合色婷婷| 亚洲茄子视频| 亚洲男人的天堂在线aⅴ视频| 国产精品一区二区久久| 久久精品中文字幕免费mv| 亚洲高清毛片| 午夜精品一区二区三区电影天堂| 国产亚洲毛片| 欧美国产一区二区三区激情无套| 999亚洲国产精| 久久久久久久999| 日韩午夜av| 国产欧美一区二区精品秋霞影院| 久久亚洲午夜电影| 日韩亚洲欧美一区二区三区| 久久大香伊蕉在人线观看热2| 在线观看一区| 欧美日韩中文字幕精品| 欧美影院久久久| 亚洲精品一区二区三区四区高清 | 久久激情综合网| 亚洲国产日韩一区| 国产精品每日更新在线播放网址| 久久精品国产亚洲a| 亚洲精品久久7777| 久久久99免费视频| 在线综合亚洲欧美在线视频| 激情小说另类小说亚洲欧美| 欧美日本国产视频| 久久国产精品毛片| 在线一区日本视频| 91久久久国产精品| 久久亚洲风情| 午夜在线成人av| 夜夜爽www精品| 经典三级久久| 久久国产欧美| 国内精品嫩模av私拍在线观看 | 欧美一区二区三区免费在线看| 久久免费偷拍视频| 久久久久国产精品www| 国产精品视频自拍| 久久精品一区二区三区不卡牛牛| 国产精品99久久久久久久vr | 欧美三级中文字幕在线观看| 悠悠资源网亚洲青| 亚洲精品一区二区网址| 亚洲网站在线|