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

小明思考

高性能服務器端計算
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>
            久久综合国产精品| 欧美专区在线观看| 国产精品久久一区二区三区| 欧美精品久久久久久久免费观看| 欧美xart系列高清| 欧美精品免费在线| 欧美特黄一区| 国产区亚洲区欧美区| 韩国美女久久| 亚洲日本在线观看| 亚洲一卡二卡三卡四卡五卡| 欧美一区不卡| 久久久伊人欧美| 欧美成人一品| 亚洲免费av电影| 欧美一级淫片aaaaaaa视频| 久久九九免费| 欧美视频在线观看| 好看的日韩视频| 一区二区三区四区五区精品视频| 午夜在线观看免费一区| 免费成人av在线| 99riav1国产精品视频| 欧美一区综合| 欧美三日本三级少妇三2023| 国产自产女人91一区在线观看| 亚洲第一中文字幕在线观看| 亚洲在线观看视频| 免费日韩成人| 午夜精品亚洲一区二区三区嫩草| 免费久久精品视频| 国产日韩欧美精品一区| 一区二区福利| 欧美国产日产韩国视频| 欧美一区二区高清在线观看| 欧美日韩另类字幕中文| 在线日韩电影| 久久国产精品免费一区| 99国产精品久久久久久久久久 | 国产欧美精品在线观看| 亚洲人成艺术| 噜噜噜噜噜久久久久久91| 在线视频欧美日韩精品| 欧美承认网站| 国外成人网址| 欧美一区二区久久久| 99精品福利视频| 亚洲欧美日韩在线一区| 亚洲人成亚洲人成在线观看| 久久久人成影片一区二区三区| 日韩一级大片| 欧美大片免费| 亚洲黄一区二区三区| 久久乐国产精品| 亚洲欧美一区二区激情| 国产精品乱码人人做人人爱| 亚洲日本va午夜在线电影| 女人色偷偷aa久久天堂| 欧美在线高清视频| 国产婷婷色一区二区三区四区| 亚洲欧美国产高清| 夜夜嗨av一区二区三区| 欧美日本国产精品| 99精品欧美一区二区三区综合在线| 能在线观看的日韩av| 久久人人爽爽爽人久久久| 伊人成人在线视频| 久久午夜色播影院免费高清| 久久精品91久久香蕉加勒比| 激情五月***国产精品| 久久青草久久| 久久美女性网| 91久久精品一区二区三区| 亚洲二区精品| 免费成人小视频| 亚洲人www| 亚洲另类在线视频| 国产精品高潮呻吟视频| 欧美在线一二三区| 久久久久久网站| 亚洲精品在线三区| 亚洲作爱视频| 国产午夜亚洲精品理论片色戒| 久久视频一区二区| 欧美风情在线| 亚洲一区二区三区四区中文| 午夜视频久久久| 亚洲国产乱码最新视频| 99国产精品久久久久老师| 国产精品一区二区三区免费观看| 久久国产精品一区二区三区四区| 久久久精品国产一区二区三区| 亚洲精品一区二区三区婷婷月| 一本久久a久久精品亚洲| 国产在线精品二区| 亚洲精品一区二区三区四区高清 | 亚洲国产精品久久久久婷婷老年| 欧美日韩免费精品| 久久丁香综合五月国产三级网站| 久久综合色一综合色88| 亚洲午夜激情网站| 久久久久久亚洲精品不卡4k岛国| 夜夜精品视频一区二区| 欧美在线你懂的| 欧美国产成人精品| 韩国欧美国产1区| 亚洲福利视频网站| 国产伦精品一区二区三区免费| 另类天堂视频在线观看| 欧美日韩亚洲91| 免费成人美女女| 国产精品劲爆视频| 亚洲国产精品va在线看黑人动漫| 国产女主播视频一区二区| 亚洲第一主播视频| 国产亚洲一区二区三区在线播放| 亚洲精品社区| 亚洲激情另类| 久久成人精品视频| 亚洲欧美成人| 欧美日韩视频在线一区二区 | 久久久久国产一区二区三区四区| 欧美日韩成人综合在线一区二区| 老鸭窝亚洲一区二区三区| 国产精品视区| 一本色道**综合亚洲精品蜜桃冫| 亚洲国产一成人久久精品| 亚洲欧美日韩一区二区| 亚洲免费在线看| 欧美日韩一区二区精品| 亚洲国产一区二区三区青草影视| 在线观看日韩专区| 久久视频精品在线| 你懂的一区二区| 在线免费观看成人网| 久久精品国产在热久久| 久久夜色精品| 1204国产成人精品视频| 久久久久久精| 欧美成人中文字幕在线| 在线观看福利一区| 久久久久国产精品一区| 麻豆91精品91久久久的内涵| 影音欧美亚洲| 免费一区视频| 亚洲精品小视频| 亚洲一区二区三区色| 国产精品久久福利| 亚洲综合清纯丝袜自拍| 久久精品国产亚洲一区二区| 国产主播一区| 久久影院亚洲| 最新中文字幕一区二区三区| 日韩亚洲欧美成人| 国产精品盗摄久久久| 校园激情久久| 欧美激情视频给我| 99精品视频免费观看视频| 欧美色偷偷大香| 午夜欧美大片免费观看| 美女日韩欧美| 999在线观看精品免费不卡网站| 欧美日韩999| 先锋影音国产一区| 亚洲第一区在线观看| 亚洲一区日韩在线| 一区二区三区在线免费观看| 欧美激情区在线播放| 亚洲精华国产欧美| 在线视频精品| 亚洲一区二区动漫| 国产在线拍偷自揄拍精品| 久久理论片午夜琪琪电影网| 亚洲久久一区| 久久琪琪电影院| 中文日韩在线| 国内精品国产成人| 欧美日韩国产影院| 久久精品国产69国产精品亚洲| 亚洲欧洲一区二区三区在线观看 | 欧美~级网站不卡| 亚洲色图综合久久| 亚洲大黄网站| 国产欧美一区二区精品仙草咪 | 伊人久久av导航| 欧美日韩一区二| 久久久久国产精品一区三寸| 亚洲色在线视频| 亚洲国产一区二区在线| 久久黄金**| 亚洲视频一区二区在线观看 | 久久精品国内一区二区三区| 亚洲美女诱惑| 伊人久久大香线蕉综合热线| 国产精品久久久久久久免费软件 | 亚洲欧美激情精品一区二区| 亚洲电影免费观看高清完整版在线观看| 欧美色视频在线| 欧美高清视频在线观看| 久久精品国产亚洲aⅴ|