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

            本例示范了我們如何將已經實現的兩種異步服務整合為一個服務器應用程序

            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.

             我們首先創建一個用于接收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.

            這樣我們就已經創建兩個需要完成很多工作的服務器,而這些工作都由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 王曉軒 閱讀(4171) 評論(7)  編輯 收藏 引用 所屬分類: C\C++
            久久国产免费直播| 久久久精品国产Sm最大网站| 天天躁日日躁狠狠久久| 久久天天躁狠狠躁夜夜avapp| 久久久久女人精品毛片| 99久久99久久精品国产片果冻| 99久久免费国产精品| 性做久久久久久免费观看| 久久人妻少妇嫩草AV无码专区| 精品一区二区久久久久久久网站| 久久国产香蕉视频| 久久国产欧美日韩精品| 久久婷婷五月综合97色直播| 新狼窝色AV性久久久久久| 国产69精品久久久久9999| 亚洲AV无码久久精品色欲 | 精品久久久久中文字幕一区| 蜜桃麻豆WWW久久囤产精品| 72种姿势欧美久久久久大黄蕉| 大美女久久久久久j久久| 久久人人爽爽爽人久久久| 亚洲国产精品成人AV无码久久综合影院| 中文字幕乱码人妻无码久久| 久久成人18免费网站| 国产精品久久久久影院色| 色综合久久综合中文综合网| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久亚洲AV成人无码软件| 久久亚洲精品视频| 老色鬼久久亚洲AV综合| 久久人人爽人人爽人人片AV东京热| 国产高潮久久免费观看| 成人精品一区二区久久久| 精品久久久久久久| 久久精品国产精品青草| 国产精品美女久久久久| 精品久久人妻av中文字幕| 久久大香香蕉国产| 久久国产亚洲高清观看| 久久久久久久人妻无码中文字幕爆| 亚洲国产精品无码成人片久久|