Octubre 26, 2013, 01:18:39 AM Ultima modificación: Octubre 26, 2013, 07:55:01 PM por Black_Cat
Vengo de nuevo con otro problema.

Para que entiendan el código de antemano, lo que hace es que cuando el servidor valida una conexión, le pasa 1 dato al  cliente. que es el lugar libre, en otras palabras sería como el numero de jugador.
Ahora cuando nuestro cliente se desconecta vuelve a pasar ese numero de jugador al servidor, para que este (el servidor) coloque dicho lugar en estado vacío.
Mi problema es que dicho espacio nunca se limpia y no sé donde está el problema, lo revisé y lo testee bastante rato ya, por eso acudo a ustedes :'(

-El objeto "boton_iniciaServer" es el que acepta las conexiones.
-Para cada conexión de un cliente creo una instancia de Receptor Cliente para que pueda este manejar los datos de cada cliente real


Mis codigos:

boton_iniciaServer, (evento step) aqui es donde se reciben las conexiones y se pasa los datos
[gml]
if (partida_creada)
{
    var conexion_entrante ,espacio_libre;
   
    conexion_entrante = tcpaccept(sock_coord, 1);   //se escuchan las conexiones entrantes
         
    if (cont >= global.tam) // si el tamaño es mayorIgual al maximo de jugadores permitidos
    {
        scr_desconectarCliente("No queda espacio en la sala.",conexion_entrante);
        exit;
    }

   
    if (conexion_entrante >= 0)   //si hay una conexion entrante
    {
        espacio_libre = scr_obtieneEspacioLibre(); // obtenemos un lugar
       
        if (espacio_libre != -1) // si hay lugar
        {
            cont += 1;   
            inst = instance_create(0,0,representante_cliente);//Este objeto representara a un cliente conectado
            //Esto quiere decir que cada inst, sabra su numero de jugador y de que socket vienen
            inst.numero_jugador = espacio_libre;
            inst.socket_cliente = conexion_entrante;
           
            list_jugadores[espacio_libre] = inst;//en el espacio obtenido asignamos la instancia
           
            clearbuffer();
            writebyte(const_conexionRealizada);
            writebyte(espacio_libre);
            sendmessage(conexion_entrante);
            exit;
        }
    }
}
[/gml]


Receptor de cliente, en el server (evento step);
[gml]
while(1)
{
    msg = receivemessage(socket_cliente);
    if (msg < 0) break;
   
    if (msg == 0)
    {
       instance_destroy();
       break;
    }
   
    byte = readbyte();
   
    switch(byte)
    {
        case const_desconectar: // un cliente se sale de la partida, esto es una constante que equivale a 1
           
            pos = readbyte(); // leemos el numero de jugador que nos pasa el Cliente real cuando cierra su ventana
            boton_iniciaServer.list_jugadores[pos] = 0; //ponemos en disponible el lugar
            boton_iniciaServer.cont -= 1; //descontamos un jugador
             
            instance_destroy();
        break;     
    }   
}
[/gml]

Cliente real, (evento step)
[gml]
while(1)
{
    msg = receivemessage(global.sock_servidor);

    if (msg < 0) break;
   
    if (msg == 0)
    {
        show_message("Desconexion repentina");
        instance_destroy();
        game_end();
        break;
    }
   
    byte = readbyte();
    switch(byte)
    {
        case const_desconectar:
            mensaje = readstring();
            show_message("Causa de la desconexion:#-" + string(mensaje));
            game_end();
        break;
       
        case const_conexionRealizada: // esto es una constante que equivale a 2
            numero_jugador = readbyte(); //obtenemos el numero de jugador que nos pasa el Server al conectarnos
            nick = get_string("Escribe un nombre para tu jugador", "jugador_"+string(irandom(60)));
           
             
        break;
    }

}
[/gml]

Cliente real, (evento Game end)
[gml]
clearbuffer();
writebyte(const_desconectar); // esto es una constante que equivale a 1
writebyte(numero_jugador); //enviamos nuestro numero de jugador
sendmessage(global.sock_servidor); // al servidor
[/gml]




EDIT: Quiero decir que ya lo solucioné, de la siguiente forma:

[gml]
while(1)
{
    msg = receivemessage(socket_cliente);
    if (msg < 0) break;
   
    if (msg == 0)
    {
       // SOLUCION ///////////////////////////
            pos = readbyte(); // leemos el numero de jugador que nos pasa el Cliente real cuando cierra su ventana
            boton_iniciaServer.list_jugadores[pos] = 0; //ponemos en disponible el lugar
            boton_iniciaServer.cont -= 1; //descontamos un jugador

       instance_destroy();
       break;
    }
   
    byte = readbyte();
   
    switch(byte)
    {
        case const_desconectar: // un cliente se sale de la partida, esto es una constante que equivale a 1
           
            pos = readbyte(); // leemos el numero de jugador que nos pasa el Cliente real cuando cierra su ventana
            boton_iniciaServer.list_jugadores[pos] = 0; //ponemos en disponible el lugar
            boton_iniciaServer.cont -= 1; //descontamos un jugador
             
            instance_destroy();
        break;     
    }   
}
[/gml]