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