• <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)的兩種異步服務(wù)整合為一個服務(wù)器應(yīng)用程序。

            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客戶端連接的服務(wù)器對象。

            
            
               tcp_server server1(io_service);

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

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

            
            
            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)建兩個需要完成很多工作的服務(wù)器,而這些工作都由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服務(wù)器類

            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服務(wù)器類

            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 王曉軒 閱讀(4159) 評論(7)  編輯 收藏 引用 所屬分類: C\C++
            久久久九九有精品国产| 久久久久久久亚洲精品| 久久国产高潮流白浆免费观看| 无码日韩人妻精品久久蜜桃 | 青青国产成人久久91网| 久久久精品国产亚洲成人满18免费网站 | 久久久WWW成人| 久久久噜噜噜久久熟女AA片| 国产精品丝袜久久久久久不卡 | 久久精品国产99国产精品亚洲 | 国产欧美久久久精品影院| 久久精品国产亚洲AV麻豆网站| 久久精品国产一区二区| 性欧美大战久久久久久久久| 青青草国产成人久久91网| 亚洲伊人久久大香线蕉综合图片| 国产高清国内精品福利99久久| 久久精品久久久久观看99水蜜桃| 国产女人aaa级久久久级| 色欲久久久天天天综合网| 亚洲精品无码久久久| 一级做a爰片久久毛片16| 久久久久久久久无码精品亚洲日韩| 久久青青草原精品国产不卡| 狠狠色丁香婷婷久久综合不卡| 精品久久久无码人妻中文字幕| 色婷婷狠狠久久综合五月| 国产精品成人久久久久久久| 色婷婷综合久久久久中文一区二区 | 99久久er这里只有精品18| 人人妻久久人人澡人人爽人人精品 | 国产精品久久久久久一区二区三区 | 欧美黑人又粗又大久久久| 久久精品国产亚洲AV影院| 久久综合色老色| 无夜精品久久久久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品无码一区二区三区日韩| 久久久久久免费一区二区三区| 91久久婷婷国产综合精品青草 | 久久最新精品国产|