Saber o horario em que o computador conectou na Internet

Alguem tem alguma ideia de como implementar um programa para capturar o exato momento em que o computador conectou-se a Internet ?

Procurei alguma solucao pronta para Windows Vista no baixaki, mas nao encontrei, por isso pensei em desenvolver.

Neste post tem uma solucao, mas que depende da acao do usuario executar a chamada.

Mas como deixar isso automatico,? Tipo rodando o tempo todo e capturando sozinho o momento da conexao. Gostaria de manter um historico de conexoes a Internet com dia e hora.

A duvida eh como implementar um programa para ficar rodando o tempo todo. Teria que deixar num loop infinito tentado fazer conexoes a cada n segundos ?
Teria alguma solucao melhor do que esta ?

Bom, o primeiro é entender o que voce quer que o programa entenda como “o estar conetado a internet”…

minha idéia é meio boba mas …

voce poderia deixar o prgrama rodando um ping o tempo todo, com algo do tipo



Process process = Runtime.getRuntime().exec("cmd /c ping "algum site.." ")

e capturar a saida, caso de resposta está conectado, ai da um jeito de capturar a hora em que a resposta foi capturada e cria uma variável “estado” atribua a ela o valor de “conectado”, e quando o ping parar de responder muda a variavel pra desconectado e guarda a hora em q isso aconteceu…

Não sei se ficou claro… e sei que é uma solução meio rustica né… mas quem sabe te da uma luz ae né? abs…

Eu pensei nisso tambem, nesse tipo de solucao. Mas alguem sabe dizer se em algum lugar do SO fica registrada essa informacao, ou seja, de que esta conectado na Internet. Por exemplo, mais especificamente, no windows vista quando esta conectado aparece o globo mundial bem pequeno abaixo da conexao de rede no status da barra de tarefas (fica ao lado do relogio), ou seja queria saber onde capturar essa informacao que o SO tem que esta conectado.

[quote=swordf]Bom, o primeiro é entender o que voce quer que o programa entenda como “o estar conetado a internet”…

minha idéia é meio boba mas …

voce poderia deixar o prgrama rodando um ping o tempo todo, com algo do tipo



Process process = Runtime.getRuntime().exec("cmd /c ping "algum site.." ")

e capturar a saida, caso de resposta está conectado, ai da um jeito de capturar a hora em que a resposta foi capturada e cria uma variável “estado” atribua a ela o valor de “conectado”, e quando o ping parar de responder muda a variavel pra desconectado e guarda a hora em q isso aconteceu…

Não sei se ficou claro… e sei que é uma solução meio rustica né… mas quem sabe te da uma luz ae né? abs…[/quote]

Possivelmente ele também pinga algum ip pra saber isso… ja pensou nisso?

exatamente!

quem pinga é o serviço NCSI

ele fica rodando e enviando requisições para http://www.msftncsi.com/ncsi.txt. (acesse no browser para ver a mensagem)

mais informações:

http://technet.microsoft.com/en-us/library/cc766017(WS.10).aspx

zap, seu programa pode funcionar como um serviço rodando em segundo plano, e até mesmo usar o mesmo endereço http do NCSI.

se após a requisição a mensagem for recebida, seu sistema entra em status de conectado e salva o horário.

exatamente!

quem pinga é o serviço NCSI

ele fica rodando e enviando requisições para http://www.msftncsi.com/ncsi.txt. (acesse no browser para ver a mensagem)

mais informações:

http://technet.microsoft.com/en-us/library/cc766017(WS.10).aspx

zap, seu programa pode funcionar como um serviço rodando em segundo plano, e até mesmo usar o mesmo endereço http do NCSI.

se após a requisição a mensagem for recebida, seu sistema entra em status de conectado e salva o horário.[/quote]

Que legal isso. Pensava que era alguma coisa mais “sofisticada” … rsrs. Nao fazia ideia que era um simples ping mesmo.
Valeu pela ajuda e informacoes amigos

Não tem como descobrir isso pelo log do Windows?

Eu cheguei a procurar isso mas nao tinha encontrado nada. Mas talvez fique registrado la alguma coisa.

Use um filtro de pacotes pra evitar o overhead e ter mais detalhes quanto as conexões disponíveis, uma biblioteca que trata disso http://wiki.portugal-a-programar.pt/revistaprogramar_arquivo:18_edicao:pcap_em_java_com_jpcap

Fiz duas implementacao:

		// #01	
		try {
			
			String address = "google.com";
			// status 0: Internet is active
			// status 1: Internet is not active
			int status = -1;
			int statusOld = -1;
			
			while (true) {
				
				Process process = Runtime.getRuntime().exec("cmd /c ping -n 1 ".concat(address));
				
				status = process.waitFor();
				
				if(statusOld != status){
					System.out.println(MessageFormat.format("[{0}] {0,choice,0#   Connected|1#Disconnected} at: {1,date,dd/MM/yyyy HH:mm:ss}", status, Calendar.getInstance().getTime()));
					statusOld = status;
				}
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			System.out.println("Bye!");
		}
		// #02	
		try {
			
			String address = "google.com";
			// status 0: Internet is active
			// status 1: Internet is not active
			int status = -1;
			int statusOld = -1;
			
			while (true) {
				
				Process process = Runtime.getRuntime().exec("cmd /c ping -n 1 ".concat(address));
				int exitValue = process.waitFor();
				
				String line = null;
				/*
				BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
				while ((line=err.readLine())!=null) {
					System.out.println(line);
				}
				*/
				BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
				
				line=in.readLine();
				status = line.trim().startsWith("Ping request could not find host") ? 1 : 0;
				
				if(statusOld != status){
					System.out.println( MessageFormat.format("[{0}] {1,choice,0#   Connected|1#Disconnected} at: {2,date,dd/MM/yyyy HH:mm:ss}", exitValue, status, Calendar.getInstance().getTime()) );
					statusOld = status;
				}
				
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			System.out.println("Bye!");
		}

Achei que a primeira implementacao funcionaria bem, mas nos testes, pelo que percebi, sempre que algum pacote do ping era perdido o retorno do metodo process.waitFor(); era 1, mesmo que a conexao nao tivesse sido perdida. Ou seja invalidaria a logica do programa.

Na documentacao diz:

Entao quando um pacote eh perdido o ping trata como se a finalizacao do comando nao fosse normal ? Acho que eh isso.

A segunda implementacao apesar de mais “feia” foi a que tem funcionado. Ate agora pelo menos :slight_smile:

David, estou estudando o link q vc me passou, bem interessante. Porem nao manjo muito de rede. Em que sentido essa lib poderia ajudar no meu programa ?

Qualquer sugestao ou correcao sera bem vinda.

Fiquei testando durante a semana e parece que funcionou, mas duas questoes:

1- Tentei retomar o controle do programa ao sair com Ctrl+C pelo Prompt mas nao esta funcionando, alguem sabe por que ? Segue abaixo:

[code] // Try to get the program control after Ctrl+C command
Runtime.getRuntime().addShutdownHook(new Thread(){

				public void run(){
					System.out.println("Bye!");
					// save a message in a file
					saveHistory(MessageFormat.format("Exit at {0,date,dd/MM/yyyy HH:mm:ss}", new Date()));
				}
				
			});

[/code]
2- So para saber, no Linux (ou outros S.O.) quando se da um ping em algum site enquanto se esta desconectado da internet ele da o mesmo retorno de erro: Ping request could not find host ? Fiquei na duvida se o programa ping eh o mesmo desenvolvido pelo Mike Muuss com versoes especificas para cada S.O.

O ideal nem seria fazer um ping mas realizar uma requisição a um serviço na internet. Se voltar a requisição solicitada, ok, caso contrário, sem internet.
Aliás, o retorno da requisição deveria ser algo muito pequeno.

Caso contrário, poderá enfrentar problemas com os diferentes programas de ping.