Foros - Stratos

Proyectos => CRM32Pro => Mensaje iniciado por: Warchief en 28 de Noviembre de 2006, 02:59:17 PM

Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 02:59:17 PM
Si intento crear un servidor con:
CreateServer( port, password, 0 ) en vez de CreateServer( port, password, 1 ), se cierra solo en nada de tiempo, poniendo:

Info: Server closed.

El problema no es ese, es posible que en efecto el puerto esté todavía sin liberar por la ejecución anterior, el problema es que CreateServer devuelve 1, aún cuando el servidor se cierra sólo (parece un timeout?). ¿Cómo me entero de que el hilo del servidor no dedicado se ha caído?
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 03:03:53 PM
Por cierto, esto lo necesito porque quiero escuchar por dos puertos en el mismo programa. Es posible:

CrearServer( 2000, 0, 0 );
CrearServer( 2004, 0, 0 );


¿Sin que haya problemas? ¿Qué hace entontes la QueryKillServer?
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 03:27:43 PM
Acabo de ver que también sucede con el dedicado. ¿CreateServer devuelve alguna vez 0 ? (incluso denegando con el cortafuegos sigue dando 1!)
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 03:38:34 PM
Lo primero, solo puedes crear un servidor en tu programa...el segundo te dira que tururu.
Para que quieres escuchar por dos puertos? separa la informacion de otro modo..escucha por el mismo puerto pero envia los datos con una estructura que contenga un ID y ya separalo como desees.

Si lo haces dedicado...lanzara el thread del server y se quedara esperando alli hasta que un cliente lo mande cerrarse o se produzca un error. Salvo que crees un mega MMORPH de esos, hacer un server dedicado de este modo no tendra mucho sentido...asi que lo normal es hacerlo no dedicado y dejarlo que trabaje en segundo plano.
Como saber si esta corriendo el server? usa IsServer().

Y para que sirve el QueryKillServer()? pues muy sencillo, cuando algun cliente se conecta, este puede mandar abajo al server y como? haciendole esa query la cual causara que se cierren ordenadamente todos los clientes y despues, se autoliquide asi mismo el server jeje.

Por supuesto que alguna vez devuelve 0 el CreateServer()... cuando hay algun problema o cuando intentas crear dos sin que haya finalizado el primero... pruebalo veras. El hecho de que uses el firewall no impedira que un programa se ponga a escuchar en un puerto...lo que pasara es que ese programa nunca llegara a escuchar nada :) (lease, ningun cliente se podra conectar).

Ah, se me olvido decirte que probablemente el server no dedicado muera porque muere tu aplicacion o haces un CRM32Pro.Quit... si tu sigues con tu app, haces un bucle un meno o lo que sea.. el sigue ejecutandose.
Si estas en este caso y se cierra solito...uhmm...pasame el codigo que vea a ver...
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 04:16:01 PM
Interesante!
Al poner 2 servidores para probar como me has dicho, el primero se cierra pero el segundo sí que se queda. Parece que al hacer "server closed" limpia el puerto que tenía pillado de la ejecución anterior!.
(http://img272.imageshack.us/img272/9247/s1ut9.th.gif) (http://img272.imageshack.us/my.php?image=s1ut9.gif)
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 05:38:23 PM
Joer, eso si que es extraño... uhmm...

veras, ese info server closed, lo da el thread del servidor, vamos, que el esta arriba y corriendo pero recibe una peticion de salida, como no te da ningun error... es algo completamente controlado(nada de excepciones o cosas asi)... la cosa es: porque recibe esa señal de salida?

Necesito que hagas una cosa, bajate los ejemplos y prueba con el Netchat2, lanzalo como server a ver si te dice tambien lo de info server closed.

Desde luego ese error no lo veo en mi maquina y es el mismo codigo...que cpu tienes?

Estoy mirando el codigo y si podria haber un problemilla, por descartar..cuando inicias la red, que log usas? Es que podria haber un caso en el que una variable compartida por CreateServer() y el thread del server que se utiliza para indicar que esta todo corriendo, no llegue a ponerse a 1 antes de que el thread del server lo compruebe y por eso sale.. pero es raro, yo tengo un dual core y a mi nunca me ha pasado...debes tener una bestia de cpu! jeejje
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 06:06:11 PM
He notado que hay dos mensajes de "Server closed". Uno con la S mayúscula, y otro con la s minúscula. El que jode es el de la s minúscula (por si puede orientarte).

Sobre el log, uso mi sistema propio y no toco ILogSystem para nada (ni siquiera para inicializarlo), pero a la red le pongo en el init LOG_CONSOLE como parámetro.

Citar
Running on INTEL processor - Pentium 4(Northwood) - MMX - SSE
Selected 'P4 Northwood' optimized code path.

De bestia nada. :) (Sólo tiene HyperThreading).


Los NetChat no me han fallado (los he estado usando bastante como inspiración).


Mira:
Citar

C:\Documents and Settings\Usuario\Escritorio\Server Bin>NetWorldServer
[SERVER] Info: INetwork Server v4.00
[SERVER] Info: IP 192.168.1.33
[SERVER] Info: host name   : 8300ht
[SERVER] Info: port        : 5000

[SERVER] Info: client 'SKiller' logged in, it's using socket 0xc7bb18.
[SERVER] Client 'SKiller' has requested a CLIENTS INFO signal.
[SERVER] 'SKiller' - IP '127.0.0.1' - Current 0ms - Average 0ms.
[SERVER] Client 'SKiller' has requested a CLOSE SERVER signal.
[SERVER] Info: client 'SKiller' logged out,it was using socket 0xc7bb18.
[SERVER] Info: Server closed.
[SERVER] Info: server closed.

C:\Documents and Settings\Usuario\Escritorio\Server Bin>NetWorldServer
[SERVER] Info: INetwork Server v4.00
[SERVER] Info: IP 192.168.1.33
[SERVER] Info: host name   : 8300ht
[SERVER] Info: port        : 5000

[SERVER] Info: Server closed.
[SERVER] Info: server closed.

C:\Documents and Settings\Usuario\Escritorio\Server Bin>
C:\Documents and Settings\Usuario\Escritorio\Server Bin>NetWorldServer
[SERVER] Info: INetwork Server v4.00
[SERVER] Info: IP 192.168.1.33
[SERVER] Info: host name   : 8300ht
[SERVER] Info: port        : 5000

[SERVER] Info: server closed.
[SERVER] Warning: Quit() is going to close the server!.
[SERVER] Warning: Quit() has just closed the server!.

C:\Documents and Settings\Usuario\Escritorio\Server Bin>


Tres ejecuciones, cada cuál más rara.
1) La primera funciona. El cliente SKiller está hecho para conectarse y matar (muahhaha)
2) No se conecta y además cierra el programa tranquilamente.
3) No funciona y sin embargo cierra pasando por Quit (véase que aquí sólo ha salido el server closed en minúsculas)
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 06:10:21 PM
Iniciando el log pasa parecido:

      ILogSystem.Init("NetChatClient.log",LOG_CONSOLE_FILE,LOG_NORMAL,"ESEKEVA");



Citar

C:\Documents and Settings\Usuario\Escritorio\Server Bin>NetWorldServer

À Executing at Tue Nov 28 18:09:11 2006
[SERVER] Info: INetwork Server v4.00
[SERVER] Info: IP 192.168.1.33
[SERVER] Info: host name   : 8300ht
[SERVER] Info: port        : 5000

[SERVER] Info: client 'SKiller' logged in, it's using socket 0xc7bfb0.
[SERVER] Client 'SKiller' has requested a CLIENTS INFO signal.
[SERVER] 'SKiller' - IP '127.0.0.1' - Current 0ms - Average 0ms.
[SERVER] Client 'SKiller' has requested a CLOSE SERVER signal.
À [INetwork->SendDataNet(229,52)] Error(1):  (Sent by server).
[SERVER] Info: client 'SKiller' logged out,it was using socket 0xc7bfb0.
[SERVER] Info: Server closed.
[SERVER] Info: server closed.

À CRM32Pro successfully closed.

C:\Documents and Settings\Usuario\Escritorio\Server Bin>
C:\Documents and Settings\Usuario\Escritorio\Server Bin>
C:\Documents and Settings\Usuario\Escritorio\Server Bin>
C:\Documents and Settings\Usuario\Escritorio\Server Bin>NetWorldServer

À Executing at Tue Nov 28 18:09:55 2006
[SERVER] Info: INetwork Server v4.00
[SERVER] Info: IP 192.168.1.33
[SERVER] Info: host name   : 8300ht
[SERVER] Info: port        : 5000

[SERVER] Info: server closed.
[SERVER] Warning: Quit() is going to close the server!.
[SERVER] Warning: Quit() has just closed the server!.

À CRM32Pro successfully closed.

C:\Documents and Settings\Usuario\Escritorio\Server Bin>NetWorldServer

À Executing at Tue Nov 28 18:10:11 2006
[SERVER] Info: INetwork Server v4.00
[SERVER] Info: IP 192.168.1.33
[SERVER] Info: host name   : 8300ht
[SERVER] Info: port        : 5000

[SERVER] Info: server closed.
[SERVER] Warning: Quit() is going to close the server!.
[SERVER] Warning: Quit() has just closed the server!.

À CRM32Pro successfully closed.

C:\Documents and Settings\Usuario\Escritorio\Server Bin>
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 08:34:01 PM
jeje, lo de s en mayusculas y minusculas esta aposta para saber donde da el mensaje :)

bien... HT... con lo poco que me gusta eso..acuerdate que fue a ti (creo recordar) el que le cascaba la cosa por el HT al estar utilizando el compresor UPX en la DLL, pero bueno, no busquemos sucesos paranormales todavia.

uhmm... veo que mas o menos sigue una secuencia, sin log iniciado casca de varias maneras pero con el iniciado solo casca de una(el sacar los msg de log consigue un pequeño delay lo justo para que el efecto que te he dicho influya)... bien, no nos comamos mas la cabeza.

Te adjunto un link a la version de CRM32Pro actual, ojo, utilizalo SOLO para esta prueba y no linkes con nada que tengas hecho de antes y demas ya que actualiza los recursos de font(testeado y ok), sprites(algun bug puñeto pendiente) y tiles(en ello ando) por lo que podras conseguir que tus DPF queden innacesibles, asi que OJO, solo para esto de la red vale??. Te paso la version estatica y con depuracion :).

He cambiado eso que te dije antes para que no dependa de la planificacion de las threads o velocidad de la cpu el comprobar esa variable.

Veamos si hay suerte: http://www.megastormsystems.com/download/CRM32Pro.static.rar
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 08:37:20 PM
No hay DPFs todavía. Estaba a punto de comenzar a meter imágenes, pero antes quería montar la estructura de red.

Lo pruebo ahora mismo y te comento.
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 08:53:21 PM
Eeek! Podemos tener una versión no estática? No funciona por el manifest bla bla, que no carga las librerías de C bla
http://msdn2.microsoft.com/en-us/library/ms235560.aspx
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 09:07:12 PM
Cita de: "Warchief"Eeek! Podemos tener una versión no estática? No funciona por el manifest bla bla, que no carga las librerías de C bla
http://msdn2.microsoft.com/en-us/library/ms235560.aspx

que es eso???  :shock:

me ha recordado a los tipicos jar pidiendote el ficherito manifest :P

anyway, te compilo una en dinamico...

http://www.megastormsystems.com/download/Lib.rar

OJO, que va en dll no la mezcles con otra anterior eh? :)

PD: me ha picado un poco la curiosidad y eso parece algo del VS2005...si te digo yo que cada vez ponen mas chorraditas jejeje
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 09:16:52 PM
Sí, es del Visual2005, y es un coñazo porque no hay tutoriales buenos. Hace unos manifest para ver qué librerías del runtime tiene que linkar o algo similar. El caso es que son un coñazo :D

Probando la dll....
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 09:19:15 PM
pensando un poco mas... debe de haber alguna manera de poder usar .lib estaticas en 2005 que no han sido generadas con el.. si no..menuda chapuza de M$.

Ya por cultura general y por si alguna vez nos vuelve a pasar..alguien sabe como hacerlo?? dicho de otro modo..que le den al manifest :)
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 09:28:21 PM
Pues parece que se ha arreglado bastante. En general funciona bien (se queda escuchando en el puerto indicado). De hecho si comparo la ejecución cambiando sólo la dll (sin cambiar los exe) una falla a la primera y la otra funciona. Así que creo que has dado en el clavo.

La única diferencia que veo con respecto a los NetChat es que si le doy a la X de cerrar consola se me queda indefinidamente en
"Warning: Quit() is going to close the server"; sin embargo en los NetChat es instantáneo.

Voy a probar eso ahora. Quizá tengo que llamar antes a CRM32Pro.Quit().

<edit>
En efecto, m_networkPtr->Quit(); (donde m_networkPtr es el puntero a ::INetwork) es la llamada bloqueante.

¿Qué puede estar pasando? (asumiendo que no llamo antes a Main.Quit() porque fallaría el puntero INetwork)

Uhm
Acabo de ver que el release que se está haciendo es desde el destructor de una clase Singleton (instancia estática). ¿Es posible que sea ya liberación de la aplicación y todos los recursos de CRM32Pro ya estén liberados y por tanto jodidos? En ese caso, ¿por qué no falla el puntero sino que se queda indefinidamente esperando? ¿Qué tiene Network::Quit que pueda ser bloqueante?
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 09:39:24 PM
En vez de llamar a CRM32Pro.Quit(), prueba a hacer una llamada a INetwork->Quit() y esta forzara a que se cierre todo.

// Si aun esta abierto el thread servidor: damos aviso de cierre, informamos de ello y esperamos que acabe.
  // Tarda unos ms en cerrarse.
  if(IInternal->bServer)
  {
  IInternal->ILogN->Msg(LOG_NORMAL," [SERVER] Warning: Quit() is going to close the server!.\n");
  IInternal->bServer = 0;
  // Damos un margen para que se cierre
  SDL_Delay(50);
  // Ahora esperamos hasta que se cierre
  while(IInternal->ServerThread != NULL) SDL_Delay(50);
      IInternal->ILogN->Msg(LOG_NORMAL," [SERVER] Warning: Quit() has just closed the server!.\n");
  }


Digamos que con IInternal->bServer=0 le estoy indicando a la thread del server que vaya saliendo... y hasta que no ha salido, esperara, como a mi siempre me cerro bien, no me puse mas radical: esperar 500ms maximo y si no se ha cerrado ella solita...me la cargo!.
Prueba a ver si te hace un Quit().

He mirado los ejemplos y si cierro la consola...se cierra del modo mas bestia posible jeje, ni quit ni leches...

Lo otro era una tonteria... digamos que ponia el IInternal->bServer=1 despues de crear el thread y por lo visto, si se ejecutaba muy rapidamente esa thread al estar aun bServer=0, pensaba que era una orden de salir...ha sido cambiar el orden y poner primero el bServer=1 y ya ves que ahora todo va fino :). Son los threads que hay que tener mucho ojo ymira que lo depure en maquinas single core y dual core y nunca me paso naa... lo dicho, ese HT...jejeje.

Otra cosa mas... no se si lo estas haciendo...pero no puede usar directamente la clase Network...o te creas un objeto dinamico o estatico pero instancia que los constructures y destructores tambien hacen sus cositas :)
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 09:43:17 PM
Con CRM32Pro.Quit() no se queda parado, es con INetwork->Quit().

Se ve que ese while(IInternal->ServerThread != NULL) SDL_Delay(50);  no termina?

Quieres pasarme una versión con un cout << "." en ese while?

Y fijo que es al meter la llamada en el destructor de una variable estática (de hecho los tengo en el destructor para asegurarme de que se libera todo aún cerrando a lo bestia sin pasar por Release)

PDI: HT Rulez!!!
PDII: Has leído PM?
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 09:53:08 PM
Perdon, un misunderstanding :)

en CRM32Pro.Quit() no se bloquea porque lo cierra a lo bruto :), vamos, que antes del CRM32Pro.Quit() habria que llamar al INetwork->Quit().

He agregado un poco de logeo para avisar de ello(que es un cierre muy muy bestia jeje).

Ahora me enchufo y te paso una con los puntitos, pero de fijo que se va a estar quedando hay, creo que no me va a quedar otra que comprobar que si tras 500ms no se ha chapado...se cargue el thread con un kill... de todos modos, veamos que sucede...
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 28 de Noviembre de 2006, 09:55:02 PM
Eso enchúfate y nos pasamos. Si prefieres te paso yo el código para que depures tú, eso sí con VS8, porque añadir los ficheros es un coñazo :)
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 28 de Noviembre de 2006, 11:24:01 PM
he agregado un par de log messages pero vamos..que hacer un CRM32Pro.QUit() sin antes un INetwork->Quit()...son memory leaks y demas movidas, solo que he intentado al menos, terminar algunas cosas de forma ordenada,dentro del caos claro, para que minimo no pete.

Ahora hace la espera en ambos quit, lo extraño, a mi me funciona de maravilla :S, de todos modos, te paso una nueva url que muestra caracteres sScC dependiendo de donde esten... a ver si averiguo que leches pasa...tambien va un netchat2 para que lo corras con -s, esta listo para petar pero a mi me sale de forma ordenada...a ver a ti que te pasa.

Por cierto, un HT disable y probar el netchat2 seria aclarador :P

http://www.megastormsystems.com/download/Lib2.rar

PD: lo he probado en un AthlonXP y en un AthlonX2 y en ambos tira bien... mañana en el curro usare un P4 con HTruño activado a ver...
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 29 de Noviembre de 2006, 10:01:23 AM
Cerrando a lo bestia con un INetwork->Quit() en el destructor, sólo salen S mayúsculas.

El netchat 2 cierra continuamente, pero no falla nunca.
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 29 de Noviembre de 2006, 10:23:42 AM
Para joder el chat:

1) Crea un .h con el código:

template <class T>
class SingletonStatic
{
   static T instancia;
public:
   static T& Instancia(){
       return instancia;
   }
};
template <class T>
T SingletonStatic<T>::instancia;


class Petador : public SingletonStatic<Petador>
{
   friend class SingletonStatic< Petador >;
private:
   Petador() { }
   ~Petador() {
       INetwork->Quit();
   }
};


Añade la llamada

  Petador::Instancia();

En el main de NetChat.

Y con eso tienes el mismo resultado que me pasa a mí. No se cierra ni con el botón de consola.
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 17 de Diciembre de 2006, 04:12:25 PM
Que tal warchief, fue todo bien??
Título: servidor no dedicado se cierra solo
Publicado por: Warchief en 17 de Diciembre de 2006, 04:48:28 PM
Con las versiones piratas que comentamos por mail, parece que sí.
Hay algunos problemas, deteniéndose el ordena o el explorador de windows durante un poco (del orden de entre 0 y N segundos :) ), pero no estoy seguro de si es por los hilos que usé (algún bloqueo), por el HT, ... Salvo por eso, funciona bien.
En cualquier caso era una miniaplicación para hacer un minichat gráfico. Nada serio, sólo una prueba.

La verdad es que fue sencillo, sobre todo la parte de red, con lo del servidor dummy.


Había pensado colgarlo como ejemplo de uso de CRM32Pro, pero no sé, no sé :) (incluso tengo una página web offline ( me pregunto para qué sirve esto  ) con una explicación curiosa)

El resultado fue:
(http://img170.imageshack.us/img170/3490/capgk9.th.jpg) (http://img170.imageshack.us/my.php?image=capgk9.jpg)

<spam>
Así que, recomiendo CRM32Pro, no sólo por lo sencilla y potente que es (puedes hacer cualquier cosa ;) ), sino por el soporte recibido por parte de MegaStorm Systems (léase Az)
</spam>

Por mi parte doy por finalizada la miniaplicación.
PD: En apenas unos días, y eso que tardé más por utilizar patrones, y hacer un motorcillo wrapper de CRM32Pro
Título: servidor no dedicado se cierra solo
Publicado por: TheAzazel en 18 de Diciembre de 2006, 12:12:34 AM
ya, si a mi me pasaste la ultima version con todo bien explicadito, codigo fuente y una pagina en html :).
La verdad que yo lo colgaria en inet, te quedo bastante bien y graficamente, muy resulton :)

Gracias por los cumplidos jeje

A ver si lo pones online, ya nos contaras!!