• <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>

            小明思考

            高性能服務(wù)器端計(jì)算
            posts - 70, comments - 428, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            ACE 示例2 --- Echo Server

            Posted on 2006-02-17 15:33 小明 閱讀(7755) 評(píng)論(6)  編輯 收藏 引用 所屬分類: Network/ACE
            Echo server就是那種提供回顯服務(wù)的程序,就是收到什么,然后就發(fā)送什么的程序。

            兩種實(shí)現(xiàn)方法

            1.Per client Per Thread (每個(gè)連接每個(gè)線程來(lái)處理)

            這種方式比較簡(jiǎn)單,易于實(shí)現(xiàn)。缺點(diǎn)是如果有大量的連接,必然占用過(guò)量的系統(tǒng)資源。

            代碼:

            #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;
            }

            說(shuō)明:
                  ACE_Thread用來(lái)啟動(dòng)thread,當(dāng)有client連上來(lái)的時(shí)候,啟動(dòng)worker thread來(lái)處理。
                 

            2.事件模型
            socket里面是有select機(jī)制,ACE也提供了這種方式。
            概念:
            Event_Handler:有事件來(lái)臨的時(shí)候的處理器
            Reactor:事件管理,負(fù)責(zé)管理Event_Hanlde和分發(fā)事件
            Acceptor負(fù)責(zé)連接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;
            }

            說(shuō)明:
            1.使用ACE_Acceptor模板類來(lái)定義自己的Acceptor
            2.ACE_Reactor::instance()->handle_events()來(lái)實(shí)現(xiàn)事件分發(fā)
            3.在Event_Handle里面使用reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);來(lái)注冊(cè)要關(guān)心的事件
            4.在Event_Handle中使用peer()來(lái)獲得Sock_Stream來(lái)發(fā)送接受數(shù)據(jù)。

            Feedback

            # re: ACE 示例2 --- Echo Server  回復(fù)  更多評(píng)論   

            2006-05-26 17:47 by filebat(markfilebat@126.com
            寫得不錯(cuò), 支持支持!!!
            版主,你現(xiàn)在還有沒(méi)有弄ACE?

            想找你討教一下

            # re: ACE 示例2 --- Echo Server  回復(fù)  更多評(píng)論   

            2007-07-22 09:12 by perlman@163.com
            例2中,對(duì) if(peer().send_n(buffer,len)<=0)的調(diào)用是一個(gè)阻塞方法,在這里會(huì)阻塞其他事件的發(fā)生。在繁忙的情況下會(huì)降低服務(wù)器的性能,值得商榷。

            # re: ACE 示例2 --- Echo Server  回復(fù)  更多評(píng)論   

            2007-12-26 17:04 by 南龍
            快速入門,頂!

            # re: ACE 示例2 --- Echo Server  回復(fù)  更多評(píng)論   

            2007-12-26 17:32 by 南龍
            那里有 ACE 的幫組文件。像 MSDN?

            # re: ACE 示例2 --- Echo Server  回復(fù)  更多評(píng)論   

            2011-02-24 19:04 by Grave
            I love <a href="http://www.google.com">China</a>!

            # re: ACE 示例2 --- Echo Server  回復(fù)  更多評(píng)論   

            2014-01-22 18:19 by asdfadfasfd
            <script>alert("fuck the world!");</script>
            久久久亚洲欧洲日产国码二区| 91精品国产综合久久婷婷| 久久人人爽人人爽人人片AV东京热| 久久成人精品| 久久久久亚洲AV无码网站| 国产精品99久久久久久宅男| 久久久久亚洲国产| 亚洲一区中文字幕久久| 亚洲精品白浆高清久久久久久| 久久AⅤ人妻少妇嫩草影院| 亚洲色欲久久久综合网| 久久无码国产| 66精品综合久久久久久久| 日韩人妻无码精品久久久不卡| 久久五月精品中文字幕| 天天综合久久久网| 91精品国产乱码久久久久久| 思思久久精品在热线热| 人人狠狠综合88综合久久| 久久av高潮av无码av喷吹| 亚洲国产精品久久久久网站| 久久超乳爆乳中文字幕| 久久精品国产免费观看| 国内精品人妻无码久久久影院导航| 久久www免费人成看国产片| 热re99久久精品国产99热| 久久久精品午夜免费不卡| 精品国产福利久久久| 久久777国产线看观看精品| 99久久成人国产精品免费| 97r久久精品国产99国产精| 人妻久久久一区二区三区| 久久久久久久久久久久中文字幕| 77777亚洲午夜久久多喷| 人妻精品久久无码专区精东影业| 国产A三级久久精品| 久久Av无码精品人妻系列| 99久久综合狠狠综合久久止| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久精品一区二区三区AV| 亚洲中文字幕无码久久精品1|