• <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 王曉軒 閱讀(4157) 評論(7)  編輯 收藏 引用 所屬分類: C\C++
            色欲综合久久中文字幕网| 日产精品久久久久久久| 国产精品青草久久久久婷婷| 国产成人久久精品区一区二区| 亚洲国产天堂久久综合网站| 久久精品国产精品亚洲人人 | 亚洲狠狠久久综合一区77777 | 要久久爱在线免费观看| 精品久久久久久无码专区不卡| 久久精品三级视频| 久久国产乱子伦免费精品| 久久国产精品一区| 久久精品国产亚洲av麻豆小说 | 人妻精品久久无码区| 国产精品热久久无码av| 久久精品黄AA片一区二区三区| 日产久久强奸免费的看| 欧美综合天天夜夜久久| 亚洲香蕉网久久综合影视| 久久黄视频| 国产精品免费久久久久电影网| 欧美牲交A欧牲交aⅴ久久 | 久久国产视频网| 国内精品伊人久久久久av一坑 | 潮喷大喷水系列无码久久精品| 色天使久久综合网天天| 青青草原综合久久大伊人导航| 久久狠狠色狠狠色综合| 99热成人精品热久久669| 日韩人妻无码一区二区三区久久| 青青草原综合久久大伊人导航| 精品人妻伦一二三区久久| 国产精品久久毛片完整版| 国产综合久久久久| 国产午夜久久影院| 成人国内精品久久久久影院| 成人久久综合网| 情人伊人久久综合亚洲| 国产成人精品久久一区二区三区av| 久久国产精品一国产精品金尊| 国产精品久久亚洲不卡动漫|