TCPServer::~TCPServer(void) {
#ifdef DEBUG
- cerr << __FILE__ << ": destructor." << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": destructor." << endl;
#endif // DEBUG
+ Glib::Mutex::Lock lock(connections_mutex);
+ for (ConnectionList::iterator con = connections.begin();
+ con != connections.end(); con++) {
+ (*con)->finish(true);
+ }
}
-TCPServer::TCPServer(const Connection::Port& port): socket(sockbuf::sock_stream) {
+TCPServer::TCPServer(const Connection::Port& port) throw(sockerr):
+ socket(sockbuf::sock_stream) {
#ifdef DEBUG
- cerr << __FILE__ << ": port = " << port << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": port = " << port << endl;
#endif // DEBUG
// FIXME
//cerr << "recvtimeout = " << socket.recvtimeout(1) << endl;
//cerr << "sendtimeout = " << socket.sendtimeout(1) << endl;
socket.bind(port);
#ifdef DEBUG
- cerr << __FILE__ << ": escuchando en " << socket.localhost()
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": escuchando en " << socket.localhost()
<< ":" << socket.localport() << "." << endl;
#endif // DEBUG
socket.listen(MAX_PENDING_CONNECTIONS);
#ifdef DEBUG
- cerr << __FILE__ << ": [despues de listen()] escuchando en "
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": [despues de listen()] escuchando en "
<< socket.localhost() << ":" << socket.localport() << "." << endl;
#endif // DEBUG
}
-void TCPServer::finish(bool attach) {
+/*void TCPServer::finish(bool attach) {
//socket_mutex.lock();
socket.shutdown(sockbuf::shut_readwrite);
//socket_mutex.unlock();
Runnable::finish(attach);
-}
+}*/
void TCPServer::on_connection_finished(Connection* connection) {
#ifdef DEBUG
- cerr << __FILE__ << ": on_connection_finished(connection = "
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": on_connection_finished(connection = "
<< connection << ")" << endl;
#endif // DEBUG
Glib::Mutex::Lock lock(connections_mutex);
connections.remove(connection);
#ifdef DEBUG
- cerr << __FILE__ << ": lista de conexiones" << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": lista de conexiones" << endl;
for (ConnectionList::const_iterator i = connections.begin();
i != connections.end(); i++) {
cerr << "\t " << *i << endl;
/// \todo TODO: ver tema de timeout o como salir de un accept().
void TCPServer::real_run(void) {
#ifdef DEBUG
- cerr << __FILE__ << ": real_run()" << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": real_run()" << endl;
#endif // DEBUG
Connection* connection;
while (!stop) {
// Forma grasa de salir del accept: crear conexion que salga al toque.
- connection = new_connection(socket.accept());
+ try {
+ connection = new_connection(socket.accept());
+ } catch (const sockerr& e) { // No se si el accept() puede fallar.
+ error(e.serrno(), e.errstr());
+ continue; // Supongo que puede seguir aceptando conexiones.
+ }
#ifdef DEBUG
- cerr << __FILE__ << ": real_run(): connection = " << connection
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": real_run(): connection = " << connection
<< endl;
#endif // DEBUG
Glib::Mutex::Lock lock(connections_mutex);
// XXX connections_mutex.lock();
connections.push_back(connection);
#ifdef DEBUG
- cerr << __FILE__ << ": real_run(): lista de conexiones" << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": real_run(): lista de conexiones" << endl;
for (ConnectionList::const_iterator i = connections.begin();
i != connections.end(); i++) {
cerr << "\t " << *i << endl;
bool TCPServer::disconnect(const std::string& host, const Connection::Port& port) {
#ifdef DEBUG
- cerr << __FILE__ << ": disconnect(host = " << host
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": disconnect(host = " << host
<< ", port = " << port << ")" << endl;
#endif // DEBUG
Glib::Mutex::Lock lock(connections_mutex);
return false;
}
+/// \todo TODO Hay que reemplazarlo por una lista generica.
TCPServer::ConnectionInfoList TCPServer::get_connected(void) {
#ifdef DEBUG
- cerr << __FILE__ << ": get_connected()" << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": get_connected()" << endl;
#endif // DEBUG
TCPServer::ConnectionInfoList cl;
Glib::Mutex::Lock lock(connections_mutex);