+ Responder ao Tópico



  1. #1
    Visitante

    Padrão Problema na utilizacao de sockets

    tenho um programa que funciona da seguinte maneira, ele usa somente um socket, onde
    recebe todas as conecções, para cada conecção eu aloco um int para
    identificar a conexao mais ou menos assim (em pseudo codigo):

    void *funcao_do_thread (void *arg) {
    /*Faz a consulta SQL*/
    analisar(elemento_atual_da_fila->string_sql);

    /*Envia a resposta*/
    write(elemento_atual_da_fila->id_conexao,resposta);

    --------->> /*Fecha a conexao, o problema está aqui*/
    close(elemento_atual_da_fila->id_conexao);
    }

    O problema é simples. Se eu fecho a conexao, o programa nao executa o write
    de resposta. Se eu nao fecho, após exatas 1018 conexoes o programa da erro
    na chamada accept() e nao aceita mais nenhuma conexao. Acho que é o limite
    de conexoes abertas no mesmo socket, mas o que nao entendo é porque eu nao
    posso fechar a conexao.

    A funcao main esta mais ou menos assim

    int main (void) {
    int *id_conexao;
    /*Inicializa as variaveis de rede*/
    ...

    for (;<IMG SRC="images/forum/icons/icon_wink.gif"> {
    /*Aguarda requisicoes*/
    id_conexao =(int *)malloc(sizeof(int));
    if (*id_conexao = accept(socket_id,(struct sockaddr *)&isa, &tamanho) < 0)
    {
    erro();
    }
    else {
    i = read(*id_conexao,mensagem,sizeof(mensagem));
    /*Insere na fila a mensagem a ser respondida e o respectivo id da
    conexao*/
    insere_na_fila(mensagem,*id_conexao);
    }
    }
    ...
    }

    Estou fazendo o controle de race conditions, as mensagens enviadas no programa cliente estão chegando ao servidor, o unico problema é com as conexoes que se fechadas impedem o funcionamento de write, e se nao fechadas o socket aceite somente 1018 conexoes.

    []&acute;s

  2. #2

    Padrão Problema na utilizacao de sockets

    bom tente fazer assim....

    bindei este servidor a porta X ... desta maneira com cada conexao solicitada pelo cliente voce cria um socket, quando o cliente fechar a conexao na outra ponta esse socket tbm fecha, eh simples.

    Creio eu q voce prescisa de 1 socket por cliente (conexao) e nao um socket para o servidor todo? que tal? tente e veja se funcione.

  3. #3
    Visitante

    Padrão Problema na utilizacao de sockets

    mistmst, nao entendi muito bem o que voce falou. Se eu utilizar um socket pra cada conexao de cliente, como o cliente saberá em qual porta ele deverá conectar? È possivel criar varias sockets na mesma porta?

    E o que eha de errado em receber várias conexoes no mesmo socket?