#include "plaqui/server/tcpserver.h"
#include <sigc++/class_slot.h>
+#include <glibmm/timer.h>
#ifdef DEBUG
# include <iostream>
#endif // DEBUG
cerr << __FILE__ << "(" << __LINE__ << ")"
<< ": destructor." << endl;
#endif // DEBUG
- Glib::Mutex::Lock lock(connections_mutex);
+ // Mando a terminar todas las conexiones.
+ connections_mutex.lock();
for (ConnectionList::iterator con = connections.begin();
con != connections.end(); con++) {
- (*con)->finish(true);
+ (*con)->finish();
+ }
+ ConnectionList::size_type count = connections.size();
+ connections_mutex.unlock();
+ // Espero que terminen realmente.
+ while (count) {
+ Glib::usleep(10000); // 10 milisegundos
+ connections_mutex.lock();
+ count = connections.size();
+ connections_mutex.unlock();
}
}
//cerr << "sendtimeout = " << socket.sendtimeout(1) << endl;
//cerr << "recvtimeout = " << socket.recvtimeout(1) << endl;
//cerr << "sendtimeout = " << socket.sendtimeout(1) << endl;
+ socket.reuseaddr(true);
socket.bind(port);
#ifdef DEBUG
cerr << __FILE__ << "(" << __LINE__ << ")"
}
/*void TCPServer::finish(bool attach) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": finish(attach = " << attach << ");" << endl;
+#endif // DEBUG
//socket_mutex.lock();
- socket.shutdown(sockbuf::shut_readwrite);
+ close(socket.sd());
+ //socket.shutdown(sockbuf::shut_readwrite);
//socket_mutex.unlock();
Runnable::finish(attach);
}*/
#endif // DEBUG
}
-/// \todo TODO: ver tema de timeout o como salir de un accept().
-void TCPServer::real_run(void) {
+void TCPServer::real_run(void) throw() {
#ifdef DEBUG
cerr << __FILE__ << "(" << __LINE__ << ")"
<< ": real_run()" << endl;
#endif // DEBUG
Connection* connection;
- while (!stop) {
+ while (!stop()) {
// Forma grasa de salir del accept: crear conexion que salga al toque.
try {
connection = new_connection(socket.accept());
} catch (const sockerr& e) { // No se si el accept() puede fallar.
- error(e.serrno(), e.errstr());
+ signal_error().emit(e.serrno(), e.errstr());
continue; // Supongo que puede seguir aceptando conexiones.
}
#ifdef DEBUG