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)用程序。
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;
}
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_;
};
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<char, 1> recv_buffer_;
};
See the full source listing
全部源碼:
posted on 2008-04-21 09:24
王曉軒 閱讀(4159)
評論(7) 編輯 收藏 引用 所屬分類:
C\C++