1 #include "scd_init_listener.h"
3 #include "scd_logging.h"
4 #include "scd_exception.h"
5 #include "scd_in_connector.h"
8 scd_init_listener::scd_init_listener(scd_simulator &sim, uint16_t port):
9 _sim(sim), _host(""), _port(port), _handler(false) {}
12 scd_init_listener::scd_init_listener(scd_simulator &sim,
13 const std::string &host, uint16_t port):
14 _sim(sim), _host(host), _port(port), _handler(false) {}
17 scd_init_listener::~scd_init_listener()
24 void scd_init_listener::listen()
26 if (!_socket.is_valid())
28 // create listening socket
29 if (!_socket.create())
30 throw scd_exception("creating listening socket failed");
31 if (!_socket.bind(_host, _port))
32 throw scd_exception("binding listening socket failed");
33 if (!_socket.listen())
34 throw scd_exception("listening to socket failed");
39 _sim.get_poller().register_handler(*this,
40 SOCK_EV_READ | SOCK_EV_CLOSE);
44 scd_debug("socket listening");
47 scd_warn("socket is already listening");
52 void scd_init_listener::close()
56 _sim.get_poller().remove_handler(*this);
60 if (_socket.is_valid())
63 scd_debug("listener socket closed");
69 void scd_init_listener::cleanup(bool hard)
71 std::list<scd_in_connector*>::iterator iter;
73 for( iter=_connectors.begin(); iter!=_connectors.end();)
75 if ( hard || !(*iter)->is_connecting() )
78 iter = _connectors.erase(iter);
86 void scd_init_listener::handle_sock_ev(sock_ev events)
88 if (events & SOCK_EV_READ)
90 scd_debug("incomming connection");
92 scd_socket* newconn = new scd_socket();
94 if (_socket.accept(*newconn))
96 /* create a new connector that handles the connection
97 * and store it in the list of connectors */
98 scd_in_connector* connector;
99 connector = new scd_in_connector(_sim, newconn);
100 _connectors.push_back(connector);
104 // connection could not be accepted
105 scd_debug("accepting connection failed");
110 if (events & SOCK_EV_CLOSE)
112 throw scd_exception("init_listener: experienced an error");
115 if (!_socket.is_valid())
117 throw scd_exception("init_listener: unexpectedly closed");
120 } // sock_ev_handler()
123 const scd_socket& scd_init_listener::get_sock()