Hola que tal, estoy haciendo un juego LAN con la 39dll y me surge el problema de que los clientes, siguen conectándose al servidor aún cuando especifiqué que la cantidad máxima de conexiones sea una dada. Es decir que tengo una conexion máxima para 2, pero aún así siguen conectándose más cliente.

Mis códigos son:
SERVIDOR:
left mouse pressed
[GML]
if (!partida_creada)        //mientras no se haya creado una partida
{
    sock_coord = tcplisten(14808,global.tam, 2);  //abrimos un socket (creamos una partida)
    partida_creada = 1;                 //establecemos el indicador en 1 de que ya se a creado una partida
}
[/GML]

step
[GML]
if (partida_creada)
{
    var conexion_entrante, espacio_libre;
   
    conexion_entrante = tcpaccept(sock_coord, 1);
   
    if (conexion_entrante > 0)    //si hay una conexion entrante
    {
        espacio_libre = scr_obtieneEspacioLibre(); // obtenemos un lugar
       
        if (espacio_libre != -1) // si hay lugar
        {
            list_jugadores[espacio_libre] = conexion_entrante;   
            cont += 1;
        }
        //en el espacio obtenido asignamos el socket que se conectó
       
    }
}
[/GML]

CLIENTE:
evento Create
[GML]
var ip, conexion ;
conectado = 0;
ip = get_string("Ingrese IP a conectarse. ","");

conexion = tcpconnect(ip, 14808, 1);

if (conexion)
{
    global.sock_servidor = conexion;
    conectado = 1;
}
else
{
    show_message("ERROR");
    game_end();   
}
[/GML]



El 2 en tcplisten indica el número de jugadores en espera antes de entrar para cuando se recibe más de una conexión al mismo tiempo, no es el límite de jugadores en la partida, eso lo tenés que limitar a mano. Podrías hacer que se conecten igual a a los jugadores en lista_jugadores a partir del 2 solamente enviarles un byte para que sepan que no es posible conectarse. O simplemente no escuchar las conexiones luego de tener 2 jugadores
Saludos!




#2 Octubre 25, 2013, 03:27:15 PM Ultima modificación: Octubre 25, 2013, 04:46:53 PM por Black_Cat
Ahhh, ya entiendo
Bueno gracias por responder :D ya se como solucionarlo.
EDIT:
La forma en que tenía pensado solucionarlo era cambiar el evento step del server de la siguiente forma:
[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 contador es mayor al tamaño maximo no permitimos conectar
      exit;
         
   if (conexion_entrante >= 0)   //si hay una conexion entrante
   {
      espacio_libre = scr_obtieneEspacioLibre(); // obtenemos un lugar
       
      if (espacio_libre != -1) // si hay lugar
      {
         list_jugadores[espacio_libre] = conexion_entrante;//en el espacio obtenido asignamos el socket que se conectó
         cont += 1;
      }
   }
}

[/GML]

y el codigo de cliente en el evento create:
[GML]
var ip, conexion ;
conectado = 0;

ip = get_string("Ingrese IP a conectarse. ","");
conexion = tcpconnect(ip, 14808, 1);

if (!conexion)
{
    show_message("No se ha podido conectar al server.");
    game_end();
     
    exit;
}

global.sock_servidor = conexion;
conectado = 1;
[/GML]


Pero no me funciona, aún siguen conectándose más jugadores del limite.
Qué está mal? XD



Tenés que cortarlo antes del tcpaccept, el tcpaccept valida la conexión




Todavía me sigue aceptando las conexiones, por más que corte antes del tcpaccept();

Citar

if (partida_creada)
{
    var conexion_entrante ,espacio_libre;
   
    if (cont >= global.tam) // si contador es mayor al tamaño maximo no permitimos conectar
        exit;
   
    conexion_entrante = tcpaccept(sock_coord, 1);   //se escuchan las conexiones entrantes
         
    if (conexion_entrante >= 0)   //si hay una conexion entrante
    {
       espacio_libre = scr_obtieneEspacioLibre(); // obtenemos un lugar
       
       if (espacio_libre != -1) // si hay lugar
       {
          list_jugadores[espacio_libre] = conexion_entrante;//en el espacio obtenido asignamos el socket que se conectó
          cont += 1;
       }
    }
}


Aun no puedo dar con el problema :-[



Posiblemente las acepte igual y solamente devuelva el numero en esa funcion. Bueno en ese caso te recomiendo q al recibir alguien sobre cont inmediatamente le envies un mensaje para q se desconecte solo, y un mensaje inverso para avisar cuando suceda lo contrario. En el lado del cliente te quedas recibiendo en un while la confirmacion si estaba lleno o no. Te escribiria el codigo pero estoy desde el cel y ya es dificil escribir esto xD




Ah, ahora funciona. Esta mañana había implementado algo así pero solo en el evento create, ahora que lo aplico al evento step me funciona correctamente!  :)

Gracias de nuevo