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

小明思考

高性能服務器端計算
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>
            伊人天天综合| 国产亚洲欧美另类一区二区三区| 久久精品免费| 欧美精品一区二区三区在线看午夜 | 欧美国产日韩一区二区三区| 亚洲永久在线| 欧美色图一区二区三区| 亚洲日本国产| 欧美成ee人免费视频| 午夜精品国产| 国产欧美日韩亚洲精品| 亚洲欧美日韩国产中文| 一区二区高清在线| 欧美日韩一区二区高清| 亚洲午夜激情网页| 一本一道久久综合狠狠老精东影业 | 国产伦精品一区二区三区照片91| 亚洲私拍自拍| 在线一区观看| 国产精品视频一二三| 欧美影视一区| 狠狠色丁香婷婷综合影院| 在线视频一区二区| 欧美精品在欧美一区二区少妇| 亚洲日韩欧美视频| 亚洲人成高清| 欧美色网在线| 性做久久久久久免费观看欧美| 亚洲自拍电影| 国模精品娜娜一二三区| 久久中文欧美| 欧美福利视频网站| 亚洲永久网站| 午夜精品一区二区三区在线播放 | 午夜免费久久久久| 欧美一级成年大片在线观看| 黑人一区二区| 亚洲高清视频一区| 国产精品vvv| 久久在线视频| 欧美日韩国产在线播放| 亚洲欧美日韩成人| 久久精品国产99国产精品| 亚洲电影在线播放| 亚洲精品一二三区| 国产日本欧美一区二区三区| 久久久久久欧美| 欧美金8天国| 欧美一区二区三区免费视| 欧美另类久久久品| 国产午夜久久久久| 亚洲大胆美女视频| 国产精品v日韩精品v欧美精品网站| 久久精品99国产精品| 另类亚洲自拍| 亚洲一区视频在线观看视频| 欧美一区国产二区| 一区二区三区回区在观看免费视频| 亚洲无线一线二线三线区别av| 国产一二精品视频| 最新精品在线| 韩国av一区| av不卡在线看| 在线观看福利一区| 亚洲婷婷免费| 亚洲三级免费观看| 欧美在线啊v一区| 亚洲手机在线| 欧美搞黄网站| 久久视频在线看| 国产精品久久网| 亚洲欧洲一区二区天堂久久| 国产一区二区三区高清播放| 日韩天堂av| 亚洲欧洲日本在线| 久久精品av麻豆的观看方式| 亚洲天堂成人| 欧美国产免费| 美腿丝袜亚洲色图| 国产欧美日韩伦理| 亚洲综合第一页| 欧美午夜精品久久久久久孕妇 | 亚洲黄一区二区| 午夜精品在线看| 亚洲一级片在线观看| 欧美高清视频一区二区三区在线观看| 久久久久久久激情视频| 国产精品视频免费一区| 一级成人国产| 一本大道av伊人久久综合| 久热爱精品视频线路一| 久久久久久久久综合| 国产日韩欧美麻豆| 亚洲欧美日韩久久精品 | 蘑菇福利视频一区播放| 精品动漫一区二区| 久久狠狠婷婷| 久久蜜桃香蕉精品一区二区三区| 国产精品区一区二区三| 亚洲一区高清| 欧美在线|欧美| 国产欧美日韩在线视频| 亚洲免费婷婷| 久久精品视频一| 黄色影院成人| 久久一区亚洲| 欧美好骚综合网| 9色国产精品| 国产精品白丝jk黑袜喷水| 亚洲视屏在线播放| 欧美在线观看视频一区二区三区 | 欧美成人资源网| 亚洲国产成人在线| 一区二区免费在线视频| 欧美日韩免费区域视频在线观看| 亚洲国产精品美女| 一区二区三区免费观看| 国产精品久久久久一区二区| 亚洲制服欧美中文字幕中文字幕| 新狼窝色av性久久久久久| 国产在线一区二区三区四区 | 最近看过的日韩成人| 欧美日韩日日骚| 亚洲综合日韩在线| 久久久综合激的五月天| 亚洲国产一二三| 欧美色欧美亚洲高清在线视频| 亚洲一区二区三区精品视频| 久久精品人人做人人爽电影蜜月| 在线精品视频一区二区| 欧美日本精品在线| 午夜激情久久久| 欧美激情在线| 香蕉亚洲视频| 亚洲国产91| 国产精品乱子久久久久| 久久这里只有| 亚洲一区二区精品| 亚洲丁香婷深爱综合| 欧美日韩综合久久| 欧美在线一区二区| 亚洲精品国产系列| 久久狠狠婷婷| 99re6热只有精品免费观看| 国产欧美日韩亚州综合| 欧美成人一二三| 欧美一级大片在线免费观看| 亚洲激情视频网站| 久久美女艺术照精彩视频福利播放| 亚洲乱码精品一二三四区日韩在线| 国产美女精品视频免费观看| 欧美久久精品午夜青青大伊人| 欧美在线视频a| 一二三区精品福利视频| 欧美黄色免费| 久久亚洲不卡| 性色一区二区三区| 亚洲天堂成人| 亚洲精一区二区三区| 激情欧美一区| 国产三级欧美三级| 国产精品成人播放| 欧美1区视频| 久久影视三级福利片| 欧美一区观看| 欧美在线91| 欧美影院视频| 午夜精品国产| 亚洲欧美综合另类中字| 亚洲视频一区二区在线观看 | 免费亚洲一区| 久久久久久电影| 久久成人精品电影| 午夜精品久久久久| 亚洲天堂黄色| 亚洲午夜av| 亚洲制服丝袜在线| 在线综合亚洲| 一区二区三区欧美亚洲| 久久精品导航| 国产亚洲毛片| 国产免费亚洲高清| 国产精品任我爽爆在线播放| 欧美日韩大片| 欧美三级资源在线| 欧美久久成人| 欧美视频久久| 国产精品久久久久久影视| 欧美性淫爽ww久久久久无| 欧美视频1区| 国产精品五区| 国产一区免费视频| 黄色成人av在线| 亚洲国产99| 日韩一区二区高清| 在线中文字幕日韩| 亚洲欧美在线x视频| 欧美一区激情| 毛片一区二区三区| 欧美激情综合色|