-void TCPServer::finish(bool attach) {
- //socket_mutex.lock();
- socket.shutdown(sockbuf::shut_readwrite);
- //socket_mutex.unlock();
- Runnable::finish(attach);
+void TCPServer::finish(void) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": finish(void);" << endl;
+#endif // DEBUG
+ Runnable::finish();
+ // Creo una conexión suicida para que el accept() del server retorne
+ // el control y el server pueda terminar realmente.
+ try {
+ sockinetbuf suicida(sockbuf::sock_stream);
+ suicida.connect(socket.localhost(), socket.localport());
+ } catch (const sockerr& e) {
+ // FIXME mejorar codigos de error.
+ signal_error().emit(100000 + e.serrno(), string("No se pudo crear "
+ "conexión 'suicida' para terminar el servidor: ")
+ + e.errstr());
+ }