• <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>
            posts - 6,  comments - 61,  trackbacks - 0

            This tutorial program shows how to combine the two asynchronous servers that we have just written, into a single server application.

            本例示范了我們如何將已經(jīng)實現(xiàn)的兩種異步服務整合為一個服務器應用程序

            The main() function
            
            
            int main()
            {
              
            try
              {
                boost::asio::io_service io_service;

            We will begin by creating a server object to accept a TCP client connection.

             我們首先創(chuàng)建一個用于接收TCP客戶端連接的服務器對象。

            
            
               tcp_server server1(io_service);

            We also need a server object to accept a UDP client request.

            我們也需要一個用于接收UDP客戶端請求的服務器對象。

            
            
            udp_server server2(io_service);

            We have created two lots of work for the boost::asio::io_service object to do.

            這樣我們就已經(jīng)創(chuàng)建兩個需要完成很多工作的服務器,而這些工作都由boost::asio::io_service對象完成

            
            
               io_service.run();
              }
              
            catch (std::exception& e)
              {
                std::cerr 
            << e.what() << std::endl;
              }

              
            return 0;
            }
            The tcp_connection and tcp_server classes

            TCP連接和TCP服務器類

            The following two classes are taken from Daytime.3 .

            下面的兩個類實例來自例子Daytime.3。

            
            
            class tcp_connection
              : 
            public boost::enable_shared_from_this<tcp_connection>
            {
            public:
              typedef boost::shared_ptr
            <tcp_connection> pointer;

              
            static pointer create(boost::asio::io_service& io_service)
              {
                
            return pointer(new tcp_connection(io_service));
              }

              tcp::socket
            & socket()
              {
                
            return socket_;
              }

              
            void start()
              {
                message_ 
            = make_daytime_string();

                boost::asio::async_write(socket_, boost::asio::buffer(message_),
                    boost::bind(
            &tcp_connection::handle_write, shared_from_this()));
              }

            private:
              tcp_connection(boost::asio::io_service
            & io_service)
                : socket_(io_service)
              {
              }

              
            void handle_write()
              {
              }

              tcp::socket socket_;
              std::
            string message_;
            };

            class tcp_server
            {
            public:
              tcp_server(boost::asio::io_service
            & io_service)
                : acceptor_(io_service, tcp::endpoint(tcp::v4(), 
            13))
              {
                start_accept();
              }

            private:
              
            void start_accept()
              {
                tcp_connection::pointer new_connection 
            =
                  tcp_connection::create(acceptor_.io_service());

                acceptor_.async_accept(new_connection
            ->socket(),
                    boost::bind(
            &tcp_server::handle_accept, this, new_connection,
                      boost::asio::placeholders::error));
              }

              
            void handle_accept(tcp_connection::pointer new_connection,
                  
            const boost::system::error_code& error)
              {
                
            if (!error)
                {
                  new_connection
            ->start();
                  start_accept();
                }
              }

              tcp::acceptor acceptor_;
            };
            The udp_server class

            UDP服務器類

            Similarly, this next class is taken from the previous tutorial step .

            同樣,下面的這個類實例也是來自以前的示例程序。

            
            
            class udp_server
            {
            public:
              udp_server(boost::asio::io_service
            & io_service)
                : socket_(io_service, udp::endpoint(udp::v4(), 
            13))
              {
                start_receive();
              }

            private:
              
            void start_receive()
              {
                socket_.async_receive_from(
                    boost::asio::buffer(recv_buffer_), remote_endpoint_,
                    boost::bind(
            &udp_server::handle_receive, this,
                      boost::asio::placeholders::error));
              }

              
            void handle_receive(const boost::system::error_code& error)
              {
                
            if (!error || error == boost::asio::error::message_size)
                {
                  boost::shared_ptr
            <std::string> message(
                      
            new std::string(make_daytime_string()));

                  socket_.async_send_to(boost::asio::buffer(
            *message), remote_endpoint_,
                      boost::bind(
            &udp_server::handle_send, this, message));

                  start_receive();
                }
              }

              
            void handle_send(boost::shared_ptr<std::string> /*message*/)
              {
              }

              udp::socket socket_;
              udp::endpoint remote_endpoint_;
              boost::array
            <char1> recv_buffer_;
            };

            See the full source listing

            全部源碼:

            //
            // server.cpp
            // ~~~~~~~~~~
            //
            // Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
            //
            // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
            //

            #include 
            <ctime>
            #include 
            <iostream>
            #include 
            <string>
            #include 
            <boost/array.hpp>
            #include 
            <boost/bind.hpp>
            #include 
            <boost/shared_ptr.hpp>
            #include 
            <boost/enable_shared_from_this.hpp>
            #include 
            <boost/asio.hpp>

            using boost::asio::ip::tcp;
            using boost::asio::ip::udp;

            std::
            string make_daytime_string()
            {
              
            using namespace std; // For time_t, time and ctime;
              time_t now = time(0);
              
            return ctime(&now);
            }

            class tcp_connection
              : 
            public boost::enable_shared_from_this<tcp_connection>
            {
            public:
              typedef boost::shared_ptr
            <tcp_connection> pointer;

              
            static pointer create(boost::asio::io_service& io_service)
              {
                
            return pointer(new tcp_connection(io_service));
              }

              tcp::socket
            & socket()
              {
                
            return socket_;
              }

              
            void start()
              {
                message_ 
            = make_daytime_string();

                boost::asio::async_write(socket_, boost::asio::buffer(message_),
                    boost::bind(
            &tcp_connection::handle_write, shared_from_this()));
              }

            private:
              tcp_connection(boost::asio::io_service
            & io_service)
                : socket_(io_service)
              {
              }

              
            void handle_write()
              {
              }

              tcp::socket socket_;
              std::
            string message_;
            };

            class tcp_server
            {
            public:
              tcp_server(boost::asio::io_service
            & io_service)
                : acceptor_(io_service, tcp::endpoint(tcp::v4(), 
            13))
              {
                start_accept();
              }

            private:
              
            void start_accept()
              {
                tcp_connection::pointer new_connection 
            =
                  tcp_connection::create(acceptor_.io_service());

                acceptor_.async_accept(new_connection
            ->socket(),
                    boost::bind(
            &tcp_server::handle_accept, this, new_connection,
                      boost::asio::placeholders::error));
              }

              
            void handle_accept(tcp_connection::pointer new_connection,
                  
            const boost::system::error_code& error)
              {
                
            if (!error)
                {
                  new_connection
            ->start();
                  start_accept();
                }
              }

              tcp::acceptor acceptor_;
            };

            class udp_server
            {
            public:
              udp_server(boost::asio::io_service
            & io_service)
                : socket_(io_service, udp::endpoint(udp::v4(), 
            13))
              {
                start_receive();
              }

            private:
              
            void start_receive()
              {
                socket_.async_receive_from(
                    boost::asio::buffer(recv_buffer_), remote_endpoint_,
                    boost::bind(
            &udp_server::handle_receive, this,
                      boost::asio::placeholders::error));
              }

              
            void handle_receive(const boost::system::error_code& error)
              {
                
            if (!error || error == boost::asio::error::message_size)
                {
                  boost::shared_ptr
            <std::string> message(
                      
            new std::string(make_daytime_string()));

                  socket_.async_send_to(boost::asio::buffer(
            *message), remote_endpoint_,
                      boost::bind(
            &udp_server::handle_send, this, message));

                  start_receive();
                }
              }

              
            void handle_send(boost::shared_ptr<std::string> /*message*/)
              {
              }

              udp::socket socket_;
              udp::endpoint remote_endpoint_;
              boost::array
            <char1> recv_buffer_;
            };

            int main()
            {
              
            try
              {
                boost::asio::io_service io_service;
                tcp_server server1(io_service);
                udp_server server2(io_service);
                io_service.run();
              }
              
            catch (std::exception& e)
              {
                std::cerr 
            << e.what() << std::endl;
              }

              
            return 0;
            }
            posted on 2008-04-21 09:24 王曉軒 閱讀(4175) 評論(7)  編輯 收藏 引用 所屬分類: C\C++
            66精品综合久久久久久久| 国产午夜精品久久久久九九电影 | 亚洲AV无一区二区三区久久| 国产高潮国产高潮久久久91| 久久国产精品-国产精品| 国产精品福利一区二区久久| 国产美女久久精品香蕉69| 久久A级毛片免费观看| 69国产成人综合久久精品| 国产精品久久久久无码av| 久久亚洲欧美日本精品| 久久99精品久久久久久噜噜| 久久综合亚洲色HEZYO国产| 一级做a爰片久久毛片免费陪 | 99久久精品免费| 国产—久久香蕉国产线看观看| 精品综合久久久久久88小说 | 久久国产精品视频| 四虎国产精品免费久久| 色诱久久久久综合网ywww| 精品久久香蕉国产线看观看亚洲| 99久久国产主播综合精品| 无码国内精品久久人妻麻豆按摩| 久久人人爽人人爽人人片AV高清 | 精品综合久久久久久97超人| 狠狠人妻久久久久久综合| 久久夜色精品国产亚洲| 国产精品视频久久| 青春久久| 久久99精品国产99久久| 香蕉久久永久视频| AV狠狠色丁香婷婷综合久久| 亚洲国产精品综合久久网络| 久久精品无码午夜福利理论片| 久久久久一本毛久久久| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 国产—久久香蕉国产线看观看| 亚洲精品乱码久久久久久蜜桃不卡| 久久最近最新中文字幕大全| 久久亚洲AV无码精品色午夜| 国产亚州精品女人久久久久久 |