Created
August 29, 2013 04:44
-
-
Save hyqhyq3/6374351 to your computer and use it in GitHub Desktop.
echo_server.cpp
g++ -O3 echo_server.cpp -lboost_system -lboost_thread -o echo_server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdlib> | |
#include <iostream> | |
#include <boost/bind.hpp> | |
#include <boost/asio.hpp> | |
#include <boost/thread/thread.hpp> | |
#include <boost/shared_ptr.hpp> | |
#include <boost/enable_shared_from_this.hpp> | |
using boost::asio::ip::tcp; | |
int total_conn = 0; | |
class session | |
: public boost::enable_shared_from_this<session> | |
{ | |
public: | |
session(boost::asio::io_service& io_service) | |
: socket_(io_service) | |
{ | |
} | |
tcp::socket& socket() | |
{ | |
return socket_; | |
} | |
void start() | |
{ | |
socket_.async_read_some(boost::asio::buffer(data_, max_length), | |
boost::bind(&session::handle_read, shared_from_this(), | |
boost::asio::placeholders::error, | |
boost::asio::placeholders::bytes_transferred)); | |
} | |
private: | |
void handle_read(const boost::system::error_code& error, | |
size_t bytes_transferred) | |
{ | |
if (!error) | |
{ | |
boost::asio::async_write(socket_, | |
boost::asio::buffer(data_, bytes_transferred), | |
boost::bind(&session::handle_write, shared_from_this(), | |
boost::asio::placeholders::error)); | |
} | |
} | |
void handle_write(const boost::system::error_code& error) | |
{ | |
if (!error) | |
{ | |
socket_.async_read_some(boost::asio::buffer(data_, max_length), | |
boost::bind(&session::handle_read, shared_from_this(), | |
boost::asio::placeholders::error, | |
boost::asio::placeholders::bytes_transferred)); | |
} | |
} | |
tcp::socket socket_; | |
enum { max_length = 1024 }; | |
char data_[max_length]; | |
}; | |
class server | |
{ | |
public: | |
server(boost::asio::io_service& io_service, short port) | |
: io_service_(io_service), | |
acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) | |
{ | |
start_accept(); | |
} | |
private: | |
void start_accept() | |
{ | |
boost::shared_ptr<session> new_session(new session(io_service_)); | |
acceptor_.async_accept(new_session->socket(), | |
boost::bind(&server::handle_accept, this, new_session, | |
boost::asio::placeholders::error)); | |
} | |
void handle_accept(boost::shared_ptr<session> new_session, | |
const boost::system::error_code& error) | |
{ | |
start_accept(); | |
if (!error) | |
{ | |
std::cout << "total connect =" << ++total_conn <<std::endl; | |
new_session->start(); | |
} | |
} | |
boost::asio::io_service& io_service_; | |
tcp::acceptor acceptor_; | |
}; | |
int main(int argc, char* argv[]) | |
{ | |
try | |
{ | |
if (argc < 2) | |
{ | |
std::cerr << "Usage: async_tcp_echo_server <port>\n"; | |
return 1; | |
} | |
boost::asio::io_service io_service; | |
using namespace std; // For atoi. | |
server s(io_service, atoi(argv[1])); | |
int thread_num = 6; | |
if (argc > 2) | |
thread_num = atoi(argv[2]); | |
boost::thread_group th_group; | |
for (int i=0; i<thread_num; ++i) | |
{ | |
th_group.add_thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service))); | |
} | |
th_group.join_all(); | |
} | |
catch (std::exception& e) | |
{ | |
std::cerr << "Exception: " << e.what() << "\n"; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment