Página principal | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

Servidor.cpp

Ir a la documentación de este archivo.
00001 
00006 /*
00007    MUnDoCAAD MUD Engine
00008    Copyright (C) 2002-2005 José Manuel Ferrer Ortiz
00009 
00010    *****************************************************************************
00011    *                                                                           *
00012    *  This program is free software; you can redistribute it and/or modify it  *
00013    *  under the terms of the GNU General Public License version 2, as          *
00014    *  published by the Free Software Foundation.                               *
00015    *                                                                           *
00016    *  This program is distributed in the hope that it will be useful, but      *
00017    *  WITHOUT ANY WARRANTY; without even the implied warranty of               *
00018    *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU         *
00019    *  General Public License version 2 for more details.                       *
00020    *                                                                           *
00021    *  You should have received a copy of the GNU General Public License        *
00022    *  version 2 along with this program; if not, write to the Free Software    *
00023    *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  *
00024    *                                                                           *
00025    *****************************************************************************
00026 */
00027 
00028 
00029 #include <QTextStream>
00030 
00031 #include "config.hpp"
00032 #include "Log.hpp"
00033 #include "Mensajero.hpp"
00034 #include "Servidor.hpp"
00035 
00036 
00037 extern Mensajero *miMensaj;
00038 
00039 
00040 // Clase Conexion
00041 
00043 Conexion::Conexion (int desc)
00044 {
00045   setSocketDescriptor (desc);
00046 
00047   descriptor = desc;
00048   direccion  = new QString (peerAddress().toString());
00049 
00050   connect (this, SIGNAL (disconnected()), SLOT (ConexionCerrada()));
00051   connect (this, SIGNAL (readyRead()),    SLOT (Lee()));
00052 }
00053 
00055 Conexion::~Conexion ()
00056 {
00057   qDebug ("Destructor de Conexion");
00058 
00059   delete direccion;
00060 }
00061 
00063 void Conexion::ConexionCerrada ()
00064 {
00065   emit (EliminarConexion (this));
00066 }
00067 
00069 void Conexion::Lee ()
00070 {
00071   QTextStream stream (this);
00072 
00073   if (canReadLine())
00074   {
00075     QString linea = stream.readLine();
00076     miMensaj->NuevaLinea (socketDescriptor(), linea);
00077   }
00078 }
00079 
00081 void Conexion::Escribe (const QString &texto)
00082 {
00083   QTextStream stream (this);
00084 
00085   stream << texto;
00086 }
00087 
00088 
00089 // Clase Servidor
00090 
00092 Servidor::Servidor ()
00093 {
00094   setMaxPendingConnections (NUM_MAX_CONXS_PENDS);
00095 
00096   if (!listen (QHostAddress::Any, NUM_PUERTO))
00097     qFatal ("El servidor no se ha podido asociar al puerto %d.", NUM_PUERTO);
00098 
00099   QString puerto;
00100   puerto.setNum (NUM_PUERTO);
00101   Log (8, "Servidor a la espera de nuevas conexiones en el puerto " + puerto +
00102        ".\n");
00103 }
00104 
00106 Servidor::~Servidor ()
00107 {
00108   qDebug ("Destructor de Servidor");
00109 
00110   // Eliminamos todas las conexiones
00111   foreach (Conexion *con, conexiones)
00112     delete (con);
00113 }
00114 
00116 void Servidor::CierraConexion (const int descriptor)
00117 {
00118   if (!conexiones.contains (descriptor))
00119     qFatal ("Intento de cerrar la conexión de un descriptor no presente.");
00120 
00121   Conexion *con = conexiones.value (descriptor);
00122 
00123   EliminarConexion (con);
00124 }
00125 
00127 void Servidor::EliminarConexion (Conexion *con)
00128 {
00129   Log (6, "Cerrando conexión");
00130   Log (5, " procedente de la dirección IP: " + *con->direccion);
00131   Log (6, "\n");
00132   miMensaj->EliminaCanal (con->descriptor);
00133   conexiones.remove (con->descriptor);
00134   delete con;
00135 
00136   QString num_conexiones;
00137   num_conexiones.setNum (conexiones.count());
00138   Log (4, "Ahora mismo hay " + num_conexiones + " conexiones abiertas.\n");
00139 }
00140 
00142 void Servidor::Escribe (const int descriptor, const QString &texto)
00143 {
00144   if (!conexiones.contains (descriptor))
00145     qFatal ("Intento de escritura hacia un descriptor no presente.");
00146 
00147   Conexion *destino = conexiones.value (descriptor);
00148 
00149   destino->Escribe (texto);
00150 }
00151 
00153 void Servidor::incomingConnection (const int descriptor)
00154 {
00155   Conexion *entrante = new Conexion (descriptor);
00156 
00157   // Añadimos la nueva conexión a la lista de conexiones entrantes
00158   conexiones.insert (descriptor, entrante);
00159 
00160   connect (entrante, SIGNAL (EliminarConexion (Conexion *)), this,
00161            SLOT (EliminarConexion (Conexion *)));
00162 
00163   miMensaj->NuevoCanal (descriptor);
00164 
00165   Log (6, "Nueva conexión entrante aceptada.\n");
00166   Log (5, "La conexión proviene de la dirección IP: " + *entrante->direccion +
00167        "\n");
00168 
00169   QString num_conexiones;
00170   num_conexiones.setNum (conexiones.count());
00171   Log (4, "Ahora mismo hay " + num_conexiones);
00172   if (conexiones.count() == 1)
00173     Log (4, " conexión abierta.\n");
00174   else
00175     Log (4, " conexiones abiertas.\n");
00176 }

Generado el Tue Nov 29 01:04:33 2005 para MUnDoCAAD MUD Engine por  doxygen 1.4.4