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