Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <iostream>
00034 #include <sstream>
00035
00036 #include "ana.hpp"
00037
00038 using namespace ana;
00039
00040 const port DEFAULT_PORT = "30303";
00041
00042 class ChatServer : public listener_handler,
00043 public send_handler,
00044 public connection_handler
00045 {
00046 public:
00047 ChatServer() :
00048 server_( ana::server::create() ),
00049 names_()
00050 {
00051 }
00052
00053 void run(port pt)
00054 {
00055 server_->set_connection_handler( this );
00056
00057 server_->set_listener_handler( this );
00058
00059 server_->run(pt);
00060
00061
00062
00063 std::cout << "Server running, Enter to quit." << std::endl;
00064
00065 std::string s;
00066 std::getline(std::cin, s);
00067 }
00068
00069 ~ChatServer()
00070 {
00071 delete server_;
00072 }
00073 private:
00074
00075 virtual void handle_connect(ana::error_code error, net_id client)
00076 {
00077 if (! error)
00078 {
00079 std::stringstream ss;
00080 ss << "Server: User " << client << " has joined from "
00081 << server_->ip_address( client ) << ".";
00082 server_->send_all_except(client, ana::buffer( ss.str() ), this);
00083 }
00084 }
00085
00086 virtual void handle_disconnect(ana::error_code error, net_id client)
00087 {
00088 std::stringstream ss;
00089 ss << names_[client] << " disconnected.";
00090 server_->send_all_except(client, ana::buffer( ss.str() ), this);
00091 names_.erase(client);
00092 }
00093
00094 virtual void handle_send(ana::error_code error, net_id client, ana::operation_id id)
00095 {
00096 if ( error )
00097 std::cerr << "Error sending to client " << client << ". Timeout?" << std::endl;
00098 }
00099
00100 std::string get_name(const std::string& msg)
00101 {
00102 size_t pos = msg.find(" ");
00103
00104 return msg.substr(pos+1);
00105 }
00106
00107 void parse_command(net_id client, const std::string& msg)
00108 {
00109 switch (msg[1])
00110 {
00111 case 'n':
00112 names_[client] = get_name(msg);
00113 break;
00114 case 'w':
00115 std::stringstream ss;
00116 ss << "Connected clients: \n";
00117
00118 std::map<net_id, std::string>::iterator it;
00119 for(it = names_.begin(); it != names_.end(); ++it)
00120 ss << " " << it->second << "\n";
00121
00122 server_->send_one(client, ana::buffer( ss.str() ), this);
00123 break;
00124 }
00125 }
00126
00127 virtual void handle_receive( ana::error_code error,
00128 net_id client,
00129 ana::read_buffer buffer)
00130 {
00131 if (! error)
00132 {
00133 std::string msg = buffer->string();
00134
00135 if (msg.empty())
00136 std::cout << "Received empty buffer. Size: " << buffer->size() << "\n";
00137 else if (msg[0] == '/')
00138 parse_command(client, msg);
00139 else
00140 {
00141 std::stringstream ss;
00142 ss << names_[client] << " : " << msg;
00143 server_->send_all_except(client, ana::buffer( ss.str() ), this);
00144 }
00145 }
00146 else
00147 handle_disconnect(error, client);
00148 }
00149
00150 server* server_;
00151 std::map<net_id, std::string> names_;
00152 };
00153
00154 int main(int argc, char **argv)
00155 {
00156 std::cout << "Use " << argv[0] << " port_number to run on a specific port (default: "
00157 << DEFAULT_PORT << ".)\n\n";
00158
00159 port pt(DEFAULT_PORT);
00160
00161 if ( argc > 1 )
00162 pt = argv[1];
00163
00164 ChatServer server;
00165 server.run(pt);
00166 }