Falha na conexão?
Enviado: Seg Ago 15, 2016 10:50 am
Bom dia! Pessoal, me desculpem se já há algo relacionado, mas eu não consegui encontrar nada aqui... Seguinte: eu uso o Networking em meu projeto, de forma bem simples mesmo baseado em tutorial que encontrei aqui mesmo no fórum. Este é o Create do Client:
E este é o Networking do Server:
Como podem ver, não é nada demais, é o basicão mesmo. O problema é o seguinte: os Clients conseguem conectar normalmente no servidor. Porém, se um dos Clients sair, nenhum outro Client consegue se conectar novamente! O script só me retorna a parte show_message("Não foi possível conectar ao servidor."), por isso não sei qual é o erro exato.
Existe alguma função ou variável que me permita ver especificamente qual é o erro que impede a conexão no servidor?
Grato!
-- EDIT --
Bom dia! Só para quem está com o mesmo problema que eu: eu resolvi isso depois que notei que quando um Client se desconecta do Server, haviam alguns códigos onde o Server continuava tentando enviar mensagens para este que Client que não está mais conectado! Isso fazia o Server entrar em loop, o que não permitia novas conexões. Ou seja, quem estiver com esse mesmo problema, certifique-se de que o Server vai parar de enviar mensagens para Clients que se desconectarem. Abraço!
Código: Selecionar todos
//---------------- INICIALIZACAO DE TODAS AS VARIAVEIS ------------------------------
Client=noone; //essa variãvel vamos usar como socket
NetworkConnect=noone; //essa variável vai testar a conexão com o server
ClientBuff=noone; //Buffer que o cliente usa para mandar mensagens para o servidor
Conectou=0; //Variavel que testa se a conexão foi bem sucedida
Erro1=0 //Variável que detecta o erro de porta ou de ip do servidor
IP=noone; //IP do servidor
Porta=noone; //Porta do servidor
//----------------------------------------------------------------------------------
AS_Type=noone; // O tipo de pacote que está chegando (1 para Conexão, 2 para Desconexão e 3 para Dados).
AS_ID=noone; // Se for um pacote do tipo 3 (dados), vai mostrar o ID do cliente que está enviando o dado
AS_IP=noone; // O IP do cliente que enviou o pacote
AS_Socket=noone; // Se for um pacote do tipo 1 ou 2, vai dizer o ID do cliente que está se conectando ou desconectando
AS_Buffer=noone; // Vai se existem dados no pacote recebido
AS_Size=noone; // O tamanho do Buffer (qtde de dados que estão chegando)
AS_Conteudo=noone; // Vai ler o conteúdo da mensagem enviada pela rede (dado).
if (Conectou==0) //se eu ainda não conectei, então vou tentar conectar nesse evendo do botao esquerdo do mouse
{
// IP=get_string("Digite o IP do Servidor","127.0.0.1"); //pegando o ip do server
IP = "127.0.0.1"
// Porta=get_string("Digite a Porta do Servidor","6554"); //pegando a porta que o server esta escutando
Porta = "6554"
Client = network_create_socket (network_socket_tcp) //criando o socket
NetworkConnect = network_connect( Client, IP, real(Porta)) //conectando
if NetworkConnect>=0 //Quando a conexão é bem sucedida, essa variável é >=0
{
Conectou=1; //então eu conectei com sucesso
Erro1=0; //sem erros
ClientBuff = buffer_create( 256, buffer_grow, 1)
ServBuff = buffer_create(256, buffer_grow, 1)
}
else //Se deu um número negativo, é pq não funcionou
{
Erro1=1; // Logo deu erro
Conectou=0; //E eu não conectei
show_message("Não foi possível conectar ao servidor.")
}
}
else //se eu já estou conectado, então eu apertei o botão do mouse para me desconectar
{
network_destroy(Client); //matei a conexão com o server
game_restart(); //reiniciei
}
Código: Selecionar todos
//Aqui é onde vão chegar as mensagens dos clientes
/*As mensagens chegam num ds_map conhecido como AsyncLoad, vamos pegar o conteúdo dessa estrutura e jogar nas
nossas variáveis. Assim podemos ler e tratar tudo que chega dos clientes.*/
AS_Type=ds_map_find_value(async_load,"type"); // o Tipo do pacote (Pedido de conexão, Pedido de desconexão ou dados)
AS_ID=ds_map_find_value(async_load,"id"); // ID de quem enviou dado (caso seja um pacote de dados)
AS_IP=ds_map_find_value(async_load,"ip"); //IP de quem enviou o pacote
AS_Socket=ds_map_find_value(async_load,"socket"); //ID de quem enviou o pedido de conexão ou desconexão
AS_Buffer=ds_map_find_value(async_load,"buffer");//Se existe buffer de dados
AS_Size=ds_map_find_value(async_load,"size");//Qual o tamanho do buffer de dados
AS_Conteudo="N/A"; //Só vou abrir se for um pacote de dados (tipo 3)
if AS_Type==network_type_connect // Se for um pedido de conexão (essa constante na verdade tem o valor =1)
{
NumeroClientes++; //Eu incremento meu contador de clientes
// Alimento as listas com informações dos Clients
ds_list_add(client_logado, false)
ds_list_add(client_sockets, AS_Socket)
ds_list_add(client_room, -1)
ds_list_add(client_x, 0)
ds_list_add(client_y, 0)
ds_list_add(client_spr, -1) // Sprites
ds_list_add(client_image, 0) // Image_index
ds_list_add(client_xscale, 1)
ds_list_add(client_nick, "")
}
if AS_Type==network_type_disconnect // Se for uma notificação de desconexão (essa constante na verdade tem o valor = 2)
{
NumeroClientes--; //Eu decremento o meu contatdor de clientes
if logados>0{
logados--
}
}
if AS_Type==network_type_data //Se for um pacote de dados (essa constante na verdade tem o valor = 3)
{
AS_Conteudo=buffer_read(AS_Buffer,buffer_string); //Nesse caso sim eu vou ler o buffer pra saber o conteúdo do dado
}
Existe alguma função ou variável que me permita ver especificamente qual é o erro que impede a conexão no servidor?
Grato!
-- EDIT --
Bom dia! Só para quem está com o mesmo problema que eu: eu resolvi isso depois que notei que quando um Client se desconecta do Server, haviam alguns códigos onde o Server continuava tentando enviar mensagens para este que Client que não está mais conectado! Isso fazia o Server entrar em loop, o que não permitia novas conexões. Ou seja, quem estiver com esse mesmo problema, certifique-se de que o Server vai parar de enviar mensagens para Clients que se desconectarem. Abraço!