一個C++ boost非同步socket server

大囚長發表於2019-01-21

編譯

g++ main.cpp -o main -lpthread -lboost_system

原始碼

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

// 非同步伺服器類
class Server {

private:

	// 服務例項
	boost::asio::io_service& ios_;

	// 接收器例項
	boost::asio::ip::tcp::acceptor acceptor_;

	// socket智慧指標
	typedef boost::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;

public:

	Server(boost::asio::io_service& _ios) : ios_(_ios),
		acceptor_(_ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 13695)) {
		// 預設執行
		start();
	}

	// 啟動網路偵聽的操作入口
	void start(void) {
		// 自定義的智慧指標
		socket_ptr socket(new boost::asio::ip::tcp::socket(ios_));
		// 非同步偵聽,若有服務連線,則自動呼叫Server::handler_accept函式,並將error, socket傳入作為引數
		acceptor_.async_accept(*socket,
			boost::bind(&Server::accept_handler, this,
			boost::asio::placeholders::error/* 此處作為佔位符 */, socket));
	}

	// 請求者響應後觸發的處理器
	void accept_handler(const boost::system::error_code& _ec, socket_ptr _socket) {
		// 錯誤碼檢測
		if (_ec) {
			return;
		}
		// 列印當前連線進來的客戶端
		std::cout << "client: " << _socket->remote_endpoint().address() << std::endl;
		// 非同步傳送 "hello CSND_Ayo" 訊息到客戶端,傳送成功後,自動呼叫Server::write_handler函式
		_socket->async_write_some(boost::asio::buffer("hello CSND_Ayo"),
			boost::bind(&Server::write_handler, this,
			boost::asio::placeholders::error/* 此處作為佔位符 */));
		// 啟動新的非同步監聽
		start();
	}

	// 完成非同步寫操作後的處理器
	void write_handler(const boost::system::error_code& _ec) {
		std::cout << "server: send message complete." << std::endl;
	}

};



int main(void) {
	try {
		std::cout << "server start." << std::endl;
		// 建造服務物件
		boost::asio::io_service ios;
		// 構建Server例項
		Server server(ios);
		// 啟動非同步呼叫事件處理迴圈
		ios.run();
	}
	catch (std::exception& _e) {
		std::cout << _e.what() << std::endl;
	}
	std::cout << "server end." << std::endl;
	return 0;
}

相關文章