gusucode.com > 它是一个c_s网络编程框架源码程序 > st_asio_wrapper/asio_server/asio_server.cpp

    
//configuration
#define SERVER_PORT		9527
#define REUSE_CLIENT //use objects pool
#define FORCE_TO_USE_MSG_RECV_BUFFER //force to use the msg recv buffer
#define ENHANCED_STABILITY
//configuration

#include "../include/st_asio_wrapper_server.h"
using namespace st_asio_wrapper;

#define QUIT_COMMAND	"quit"
#define LIST_ALL_CLIENT	"list_all_client"

//demonstrates how to use custom packer
//in the default behavior, each st_socket has their own packer, and cause memory waste
//at here, we make each echo_socket use the same global packer for memory saving
//notice: do not do this for unpacker, because unpacker has member variables and can't share each other
boost::shared_ptr<i_packer> global_packer(new packer());

class echo_server : public st_server
{
public:
	class echo_socket : public server_socket
	{
	public:
		echo_socket(st_server& st_server_) : server_socket(st_server_) {inner_packer(global_packer);}

	public:
		//because we use objects pool(REUSE_CLIENT been defined), so, strictly speaking, this virtual must be rewrote,
		//but we don't have member variables to initialize but invoke father's reuse() directly, so, it can be omitted,
		//but we keep it for possibly future using
		virtual void reuse() {server_socket::reuse();}

	protected:
		//msg handling: send the original msg back(echo server)
		//we should handle the msg in on_msg_handle for time-consuming task like this:
		virtual void on_msg_handle(const std::string& str) {send_msg(str, true);}
		//please remember that we have defined FORCE_TO_USE_MSG_RECV_BUFFER, so, st_socket will directly
		//use the msg recv buffer, and we need not rewrite on_msg(), which doesn't exist any more
		//msg handling end
	};

protected:
	virtual boost::shared_ptr<server_socket> create_client()
		{return boost::shared_ptr<server_socket>(new echo_socket(*this));}
};

int main() {
	std::string str;
	st_server server_; //simple server can directly use st_server
	echo_server echo_server_; //echo server
	st_server* servers[2] = {&server_, &echo_server_};

	for (auto i = 0; i < 2; ++i)
	{
		if (0 == i)
			puts("\nthis is a normal server.");
		else
			puts("\nthis is a echo server.");
		puts("type quit to end this server.");

		servers[i]->start_service();
		while(servers[i]->is_running())
		{
			std::cin >> str;
			if (str == QUIT_COMMAND)
				servers[i]->stop_service();
			else if (str == LIST_ALL_CLIENT)
				servers[i]->list_all_client();
			else
				servers[i]->broadcast_msg(str);
		}
	}

	return 0;
}

//restore configuration
#undef SERVER_PORT
#undef REUSE_CLIENT //use objects pool
#undef FORCE_TO_USE_MSG_RECV_BUFFER //force to use the msg recv buffer
#undef ENHANCED_STABILITY
//restore configuration