Ajuda Com Threads e Socket

Fiz um simples portscanner em java, porem ele estava testando porta a porta e estava muito lento resolvi colocar em threads, so que nao sei se fiz alguma coisa errada mais acontece que chega na porta 500(funcionando em threads) ele para de testar, o Scan continua rodano so que parece q a socket nao conecta mais ! Vou postar o codigo !!

Classe Repete (Threads)

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Repete extends Thread {
	String ark = "portas.txt";
	String host;
	int porta;
	Repete(String host, int porta) {
		this.host = host;
		this.porta = porta;
	}
	public synchronized void run() {
		try {
			FileWriter escritor = new FileWriter(ark, true);
			BufferedWriter buffer = new BufferedWriter(escritor);
			//System.out.println("Trying: " + this.porta);
			Socket s = new Socket(this.host, this.porta);
			s.setSoTimeout(1);
			buffer.write("Porta Aberta ==> "+ this.porta);
			buffer.newLine();
			buffer.flush();
			buffer.close();
			if (s.isConnected() == true) {
				s.close();
			}
		}
		catch (UnknownHostException ex) {
			System.err.println(ex);
			//break;
		}
		catch (IOException ex) {
		}	
			
	}
}

e a Classe Main que chama Scan

public class Scan {

	public static void main(String[] args) throws IOException {
		if (args.length != 0 ) {
			String host = args[0];
			int ini = Integer.parseInt(args[1]);
			int fina = Integer.parseInt(args[2]);	
			for (ini = Integer.parseInt(args[1]); ini < fina;ini++) { //aki eu quero q teste da porta 1 ate 65535, chega na 500 trava
				Repete arroba = new Repete(host, ini);
				synchronized (arroba) {
					arroba.start();
				}
			}
      }

So uma coisa que esqueci… aquele s.setSoTimeout(1) nao existe, eu q esuqeci de retirar pq estava testando umas coisas que achei na net! vlw

upppp

up

o windows tem um limite de conexões que ele abre, você pode estar alcançando esse limite.

No seu código, se for lançada alguma exceção quando você trabalha com seu “buffer”, o socket não será fechado… talvez seja isso

me corrija se estiver errado, mais o buffer que estou utilizando nada mais serve para eu salvar a porta aberta no arquivo txt “portas.txt”, oq ele faz eh abrir uma socket na porta, se conectar esta aberta!

  1. Não fique upando tópicos.
  2. Se você tem um problema de performance, use um profiler para medir e descobrir onde é o problema. Criar threads não vai resolver.
  3. Considere com carinho a possibilidade de usar C++.

Acabei de notar que vc está dando flush() toda hora.

Para que ter um buffer se vc manda que o buffer se esvazie a cada leitura?

			Socket s = new Socket(this.host, this.porta);
...
			if (s.isConnected() == true) {
				s.close();
			}

Aham, se você criar um socket, ele eventualmente deve ser fechado, mesmo que não esteja conectado.

De qualquer maneira, port scanners decentes não tentam abrir conexões (o que é muito lento e pode eventualmente acabar falhando, e ainda por cima pode ser detectado pelo firewall do outro lado, que poderá acabar encerrando todas as conexões porque aparenta ser uma atividade suspeita); eles só mandam um único pacote da negociação TCP/IP e esperam uma determinada resposta, o que não dá para fazer diretamente em Java, nem mesmo com as APIs de Winsock (no caso do Windows).

Eles precisam usar outras APIs mais complicadas que trabalham diretamente com o protocolo IP.

No WinSock acho que você consegue, se achar uma API que trabalhe com os RAW Sockets.
Trabalhar diretamente é a morte, pq envolve escrever na mão o cabeçalho IP.

Mas é essa que é a idéia. Um port scanner que se preza consegue até ocultar quem ele é, para evitar problemas com firewalls.
Um exemplo de port scanner (do bem) está no site https://www.grc.com/x/ne.dll?bh0bkyd2 (ShieldsUp). Esse site consegue checar quais são as portas que alguém na Internet está inadvertidamente expondo em segundos.

okkk vlw pelas dicas!

mais meu port scanner foi feito apenos para uso didatico!! Para intender o funcionamento de sockets com host e websites! Nao consigui achar nenhuma documentacao melhor sobre isso. Voce tem alguma ideia ?