Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





servidor no dedicado se cierra solo

Iniciado por Warchief, 28 de Noviembre de 2006, 02:59:17 PM

« anterior - próximo »

Warchief

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?

Warchief

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?

Warchief

Acabo de ver que también sucede con el dedicado. ¿CreateServer devuelve alguna vez 0 ? (incluso denegando con el cortafuegos sigue dando 1!)

TheAzazel

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...

Warchief


  • Abrir dos puertos: para separar por ejemplo datos del juego de los datos de chat, pero sí, al ver que se podía abrir sólo 1, pues o bien monto dos ejecutables (server chat + server juego) o paso por el mismo puerto con IDs de mensaje.
  • Lanzo un servidor dedicado y a pesar de no bloquearse devuelve 1. (No estoy haciéndolo con el cortafuegos, de hecho, no sé por qué falla; estará el puerto ocupado [netstat no dice nada sobre ese puerto]).
    Echa un vistazo. Devolvió 1 pero no se ha bloqueado y no tengo kill query en ningún sitio. [IsServer devuelve true también]

  • Lo de la Query me refería a qué hace cuando hay más de un servidor, pero como no es posible, está ok.
  • Con morir el no dedicado me refiero a que los clientes no se conectan, aún cuando después tengo un while( true ) { } (por lo que ni cierro ni hago quit). Sale el mensaje de "server closed." y ya está.
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!.

TheAzazel

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

Warchief

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)

Warchief

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>

TheAzazel

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

Warchief

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.

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

TheAzazel

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

Warchief

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....

TheAzazel

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 :)

Warchief

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?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.