]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/tcpserver.cpp
Se corrige el bug que hacia que aparezca un error EADDRINUSE (que el puerto ya
[z.facultad/75.42/plaqui.git] / Server / src / tcpserver.cpp
index ffbdead609cf9ae0ac28fe20fef4f232ae3780fc..8b1c3bb571c996a7ba72070b5ac7928b86a3b258 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "plaqui/server/tcpserver.h"
 #include <sigc++/class_slot.h>
+#include <glibmm/timer.h>
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
@@ -42,10 +43,20 @@ TCPServer::~TCPServer(void) {
        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();
        }
 }
 
@@ -60,6 +71,7 @@ TCPServer::TCPServer(const Connection::Port& port) throw(sockerr):
        //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__ << ")"
@@ -75,8 +87,13 @@ TCPServer::TCPServer(const Connection::Port& port) throw(sockerr):
 }
 
 /*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);
 }*/
@@ -99,19 +116,18 @@ void TCPServer::on_connection_finished(Connection* connection) {
 #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