Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Falha na conexão?

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Mikasuki
Novato
Novato
Reações: 0
Mensagens: 3

Falha na conexão?

Mensagem por Mikasuki » 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:

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
}
E este é o Networking do Server:

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

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

Trancado

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitante