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.
[]´s