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

小明思考

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

ACE 示例2 --- Echo Server

Posted on 2006-02-17 15:33 小明 閱讀(7763) 評論(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>
            亚洲激情亚洲| 免费视频一区二区三区在线观看| 亚洲网在线观看| 久久午夜色播影院免费高清| 久久精品女人天堂| 国产一区二区精品| 久久九九久精品国产免费直播| 久久亚洲春色中文字幕| 好吊色欧美一区二区三区四区| 久久精品视频导航| 亚洲制服av| 欧美伊人久久久久久久久影院 | 亚洲毛片在线观看.| 欧美激情国产日韩| 一区二区三区www| 久久精品视频播放| 亚洲欧美日韩国产综合在线| 国内精品视频666| 欧美大色视频| 亚洲免费在线观看视频| 一区二区国产在线观看| 亚洲日本激情| 国产精品久久久久久久久久直播| 亚洲一区二区三区在线播放| 美玉足脚交一区二区三区图片| 亚洲精选大片| 亚洲人成网站精品片在线观看| 国产精品视频精品| 麻豆久久精品| 亚洲欧美日韩精品久久久| 欧美成人在线免费观看| 亚洲一区3d动漫同人无遮挡| 99热这里只有成人精品国产| 国产一二三精品| 国产精品天天看| 国产嫩草一区二区三区在线观看 | 久久精品论坛| 欧美在线视频一区二区| 91久久精品一区| 久久国产精品网站| 羞羞色国产精品| 亚洲精品一区二区三区不| 国产乱码精品一区二区三区五月婷 | 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲在线播放| 91久久久久| 亚洲美女av网站| 中文亚洲字幕| 午夜一区二区三区不卡视频| 欧美有码在线观看视频| 久久天天综合| 亚洲电影专区| 老司机免费视频久久 | 欧美激情综合| 亚洲精品1区| 亚洲美女视频| 亚洲国产合集| 99re6这里只有精品视频在线观看 99re6这里只有精品 | 亚洲免费在线视频一区 二区| 亚洲免费在线观看视频| 久久久之久亚州精品露出| 欧美一区二区日韩一区二区| 亚洲视频在线观看免费| av不卡在线| 99精品国产高清一区二区| 亚洲五月婷婷| 久久人人爽人人爽爽久久| 欧美国产日韩一区二区三区| 国产精品免费一区豆花| 亚洲第一精品影视| 一区二区亚洲精品| 黄色一区二区在线| 99在线视频精品| 欧美在现视频| 亚洲欧洲在线播放| 欧美中文字幕| 欧美日韩国产精品一卡| 欧美理论片在线观看| 欧美大胆成人| 国产日韩欧美综合一区| 国产亚洲欧美一级| 亚洲精品在线电影| 欧美中文字幕久久| 久久人人爽爽爽人久久久| 久久久久久电影| 久久亚洲欧美| 一区二区三区欧美在线| 另类亚洲自拍| 欧美绝品在线观看成人午夜影视 | 午夜精品999| 欧美va亚洲va日韩∨a综合色| 国产日韩精品一区二区| 日韩一级裸体免费视频| 亚洲先锋成人| 欧美福利一区二区三区| 欧美亚洲三级| 欧美调教vk| 国产乱码精品一区二区三区不卡| 亚洲精品乱码久久久久久| 久久一区二区三区四区五区| 一区二区三区成人| 欧美精品在线观看| 亚洲福利国产| 一区二区国产在线观看| 欧美一区二区三区四区在线观看| 亚洲日本成人女熟在线观看| 久久综合久色欧美综合狠狠| 国产亚洲欧洲997久久综合| 亚洲欧美久久久| 亚洲六月丁香色婷婷综合久久| 亚洲午夜精品一区二区三区他趣| 欧美国产日韩一二三区| 亚洲国产一区二区三区高清| 久久免费99精品久久久久久| 亚洲免费小视频| 国产精品久久二区| 在线看一区二区| 久久亚洲春色中文字幕| 欧美一区2区三区4区公司二百| 国产精品久久久久久久一区探花 | 亚洲欧美日韩精品久久| av不卡免费看| 欧美三级网址| 亚洲午夜在线视频| 在线视频亚洲| 久久久综合精品| 激情一区二区三区| 久久亚洲欧美| 久久久久免费| 亚洲第一久久影院| 欧美激情第二页| 女主播福利一区| 亚洲精品一品区二品区三品区| 欧美韩国在线| 欧美精品久久久久久久久老牛影院 | 亚洲欧美日韩国产综合| 国产日韩精品一区二区三区| 久久精品九九| 久久久久国产精品午夜一区| 在线观看一区| 亚洲国产日韩欧美在线图片| 欧美在线亚洲| 在线观看视频一区二区| 欧美伊人精品成人久久综合97| 午夜精品久久久久久久99水蜜桃| 国产亚洲福利| 欧美α欧美αv大片| 午夜天堂精品久久久久| 国产精品进线69影院| 亚欧美中日韩视频| 久久精品观看| 国产亚洲观看| 欧美高清视频www夜色资源网| 你懂的一区二区| 亚洲一区二区三区中文字幕| 亚洲欧洲99久久| 亚洲国产精品成人精品| 亚洲精品一区二区网址| 国产精品夜夜夜| 久久综合一区二区| 欧美精品午夜视频| 欧美亚洲综合另类| 久热国产精品视频| 亚洲一区免费视频| 久久精品一区二区三区四区| 一本色道久久88亚洲综合88| 性久久久久久久| 亚洲欧洲在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲黄色免费网站| 国产精品一区久久久| 欧美成人免费大片| 国产精品r级在线| 亚洲免费视频观看| 久久久国产精品一区| 一区二区三区欧美在线| 羞羞漫画18久久大片| 亚洲美女在线视频| 亚洲欧美在线一区二区| 亚洲美女av电影| 欧美一区二区网站| 野花国产精品入口| 欧美中文在线观看国产| 在线亚洲国产精品网站| 久久av老司机精品网站导航| 日韩视频在线观看一区二区| 欧美中文字幕第一页| 亚洲图色在线| 欧美+亚洲+精品+三区| 久久精品中文字幕一区| 欧美日韩在线视频一区| 欧美顶级少妇做爰| 国产日韩欧美a| 9l视频自拍蝌蚪9l视频成人| 在线免费精品视频| 午夜精品在线看| 亚洲私人影院在线观看| 欧美国产国产综合| 美女主播一区| 国产一二精品视频|