Jump to content
Fórum Script Brasil
  • 0

Verificar portas simultaneamente


RodrigoGomes

Question

Boa noite amigos(as),

Estou desenvolvendo um script que verifica uma série de portas de um IP, ele apenas faz a requisição para saber se ela esta "aberta" ou "fechada", por exemplo verificar portas de 20 a 6000 no IP 123.456.789.

Beleza, ele funciona perfeitamente, excerto por um motivo: A demora.

Usando fsockopen() cada porta precisa de no mínimo 2 segundos de espera para verificar se ela esta fechada (se estiver aberta é rápido), então imagina 6 mil portas, estando apenas 3/4 abertas?

É uma demora muito grande.

Eu pesquisei em toda parte e não achei nada sobre o que quero fazer, que é testar as portas simultaneamente. Exemplo, enquanto a porta 20 esta sendo verificada a porta 21 começava a ser verificava também, depois 22, e assim por diante.

Alguém sabe se existe uma forma de fazer isso? Eu estou precisando muito.

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Hi.

Seria ótimo se o PHP tivesse threads, mas por enquanto, você vai ter que se virar com o que tem pra hoje. =p

Como o MLeandroJr! falou, você pode diminuir o timeout do fsockopen já que quando a porta está aberta, é mais rápido.

Também pode dividir a task com forking. Creio que haverá um bom ganho de desempenho.

Mas o ideal mesmo para este tipo de aplicação é utilizar outra linguagem de programação (C ou até Perl) e convocar o script de dentro do PHP.

[]'s

Link to comment
Share on other sites

  • 0

Bom, aparentemente isso deve funcionar.. mas infelizmente PCNTL não é suportado em windows e meu apache esta em um windows.

andei pensando, e bolei uma forma de fazer isso. é mais complexa porém menos demorada que a original:

eu criaria um arquivo "verificar_porta.php" que verifica apenas uma porta, após verificar ele colocaria a porta no banco de dados se ela tivesse aberta, dentro desse meu arquivo eu colocaria "ignore_user_abort(true);" que ignora se a conexão for abortada.

Depois faria outro arquivo (verificar.php), ele chamaria o "verificar_porta.php" desta forma:

$host="localhost";
if ($fp = @fsockopen($host, 80, $errno, $errstr, 2)) {
$out = "POST /verificar_porta.php HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "ip=123.456.789&porta=20";
fwrite($fp, $out);
fclose($fp);
}

Esse código ficara dentro de um for, até completar as 6 mil portas.

Ele conecta e aborta a conexão sem esperar, deixando o script "verificar_porta.php" rodando em background. Por fim, bastava o script pegar o resultado do banco de dados e exibir.

Edited by Vampyro
Link to comment
Share on other sites

  • 0

Me desculpem por ressuscitar este tópico, mais eu preciso muito desta solução...

Como foi feito?

Eu preciso fazer várias conxões ao mesmo tempo igual o Vampyro, sem esperar que uma termine para depois fazer a outra.

Se uma conexão então dura mais ou menos 2 segundos, eu preciso fazer por exemplo "6mil" conexões de uma só vez, durando 2 segundos ao total ao invés de 12 mil segundos.

Agradeço desde já!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...