Servidor socket não recebe mais de 1020 conexões [RESOLVIDO]

1. Servidor socket não recebe mais de 1020 conexões [RESOLVIDO]

Eduardo Campos
3dUcP

(usa Manjaro Linux)

Enviado em 29/04/2018 - 17:44h

Olá pessoal, estou desenvolvendo um proxy bem simples com C++ usando a biblioteca socket
o programa está praticamente pronto, porém, quando o servidor recebe mais de 1020 conexões, o accept do servidor socket passa a retornar apenas -1
Isso após exatas 1020 conexões aceita.
Alguma solução para isso?

Segue o código do servidor:

Obs: tenho pouco conhecimento em C++, meu foco está sendo apenas desenvolver esse proxy



int main(int argc, char* argv[]){
// Verifica os parametros
if ( argc < 3 ){
std::cout << "Especifique uma porta!" << std::endl;
std::cout << "Exemplo: sckt -p 80" << std::endl;
return 1;
}
// Pega a porta
int porta;
for (int i = 0; i < argc; ++i){
if ( !strncmp(argv[i],"-p",2) ){
porta = atoi(argv[i+1]);
break;
}
}
if (porta > 0){
int serversocket, clientsocks;
int opt = 1;
struct sockaddr_in address;
// Inicializa um socket
serversocket = socket(AF_INET,SOCK_STREAM,0);
// Configura o socket
setsockopt(serversocket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
// Endereço para bind
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(porta);
int address_len = sizeof(address);
// Inicializa o bind
if ( (bind(serversocket,(sockaddr*)&address,sizeof(address))) < 0 ) {
std::cout << "Erro ao abrir a porta: " << porta << std::endl;
return 1;
}
// Modo Ativo
listen(serversocket,1);
// Loop de recebimento de clientes
int clientes = 1;
std::cout << "Sucesso!" << std::endl;
std::cout << "Porta aberta: " << porta << std::endl;
while (true){
if ( (clientsocks = accept(serversocket,(sockaddr *)&address, (socklen_t*)&address_len)) > 0 ){

// Aqui trato as requisições do cliente
// Sempre uso close no FD do cliente

// Debugando...
std::cout << "Clientes: " << clientes << std::endl;
clientes++;
}
else{
// Debugando....
std::cout << "Cliente ERRO: " << clientsocks << std::endl;
break;
}
}
}
else{
std::cout << "Porta Invalida!" << std::endl;
std::cout << "Especifique uma porta!" << std::endl;
std::cout << "Exemplo: sckt -p 80" << std::endl;
return 0;
}
return 0;
}




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/04/2018 - 21:18h

Leia sobre setrlimit().

Se o sistema operacional estiver com hard limit de descritores muito pequeno, pode ser necessário ajustar /etc/security/limits.conf.

3. Ótimo! Resolvi o problema!

Eduardo Campos
3dUcP

(usa Manjaro Linux)

Enviado em 30/04/2018 - 16:25h

paulo1205 escreveu:

Leia sobre setrlimit().

Se o sistema operacional estiver com hard limit de descritores muito pequeno, pode ser necessário ajustar /etc/security/limits.conf.


Muito obrigado, consegui alterar o limite correto, sabe me informar como eu configuro para que não tenha limites?


4. Re: Servidor socket não recebe mais de 1020 conexões [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/04/2018 - 16:39h

Com setrlimit(), você deve usar a constante RLIM_INFINITY.

Contudo, o SO provavelmente tem um limite máximo para a máquina, pelo menos no caso da quantidade de descritores. O parâmetro de kernel que ajusta isso é, se não me engano, fs.nr_open (ou via /proc/sys/fs/nr_open).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts