# socket timeout



## vaporizer (24. Oktober 2004)

Hy
ich hab eine Frage zur Socketprogrammierung und dem Timeout
wie kann man das setzen?
also wenn er nach 10 sekunden noch immer nicht connecten kann 
soll er abrechen
habe folgendes versucht:

```
Socket sock = new Socket(ip, port);
sock.setSoTimeout(10000)
```
nur leider funktioniert das nicht
kann mir jemand sagen wie man das macht


----------



## Thomas Darimont (25. Oktober 2004)

Hallo!

Kannst du mal etwas Code posten der dein Problem darstellt?
Wenn ich bei mir folgendes Ausprobiere:

```
package de.tutorials;

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

public class Main {

	public static void main(String[] args) {
		long time = -System.currentTimeMillis();
		try {
			Socket s = new Socket("localhost",1099);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println((time + System.currentTimeMillis())/ 1000);
	}
}
```
dann versucht er nur eine Sekunde zu connecten, zeigt dann die Exception und terminiert anschließend.

setSOTimeOut() an einem Socket aufgerufen ändert nur die Zeit die der InputStream welcher dem Socket anbehaftet ist bei einem read() aufruf maximal Blockieren soll...
Gruß Tom


----------



## LordTerra (17. September 2007)

hi

ist zwar schon etwas älterer beitrag, aber ich hab grad das selbe problem... 
bei mir soll sich der socket mit ner ip verbinden die ich ihm geb, aber es kann auch sein das die ip die ich ihm geb nicht antwortet weil nix auf der gegenseite hängt... 

ich hab timeout zeiten von ca 20 sec... das is bei dem ip scan wo ca 255 adressen gescannt werden sollen n bissel lang ... 

bräuchte da ma hilfe

thx LordTerra


----------



## Mnyut (11. März 2009)

Also ich habe es so gelöst:


```
Socket socket = new Socket();
socket.connect(new InetSocketAddress(this.host, this.port), this.timeout);
```

Wenn ich z.B. nur 10 IPs ab scanne klappt das auch wunderbar und im eingestellten Timeout. Je mehr Adressen ich verwende, desto seltener bis gar nicht funktioniert es.

Hier der Code...


erst mal die Klasse Ping, die für jede IP verwendet wird:


```
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Ping extends Thread
{
	private int port;
	private String host;
	
	private int timeout = 0;	// in ms
	
	// die beiden werden verwendet wenn eine Verbindung zu Stande gekommen ist, habe den Code dafür aber in diesem Beispiel raus genommen, denn er funktioniert.
  private byte[] received = null;	
	private DataInputStream dis = null;

	public Ping(String[] ip, int port, int timeout)
	{
		this.port = port;
		this.host = ip[0] + "." + ip[1] + "." + ip[2]+ "." + ip[3];
		this.timeout = timeout;
	}

	public void run()
	{
		long time = -System.currentTimeMillis();
		
		try
		{
			Socket socket = new Socket();
			socket.connect(new InetSocketAddress(this.host, this.port), this.timeout);
			
			System.out.println("Connected to " + this.host + " on Port " + this.port);

			socket.close();
		}
		catch (UnknownHostException ex)
		{
			System.out.println("Unkown Host " + this.host);
		}
		catch (IOException ex)
		{}
		
		System.out.println("close: " + this.host + " (" + (time + System.currentTimeMillis()) + " ms)");
	}
}
```

Und dann die Klasse die Ping für jede IP aufruft:


```
import java.net.InetAddress;
import java.net.UnknownHostException;

import de.sonikks.g30.Ping;

public class PortSearch
{
	public static void main(String[] args)
	{
		String host = null;
		String[] ip = new String[4];
		int port = 9999;
		
		final int TIMEOUT = 1000;	// in ms
		
		final int START_IP = 150, END_IP = 160;
		
		Ping[] ping = new Ping[END_IP + 1];
		
		
		try
		{
			host = InetAddress.getLocalHost().toString();	// Adresse des Rechners herausfinden...
		}
		catch (UnknownHostException e)
		{}
		
		ip = host.split("/")[1].split("[.]");	// Hostname abtrennen und in die einzelnen Elemente aufteilen
		
		// mit scann beginnen / Threads starten
		if (ip.length == 4)
		{
			for (int i = START_IP; i <= END_IP; i++)
			{
				ip[3] = "" + i;	// Adressen durch gehen (z.B. 1 - 254)
				
				ping[i] = new Ping(ip, port, TIMEOUT);
				ping[i].start();
			}
		}
		
		// Fortschritt anzeigen
		int openSockets = 0, cache = 0, last = 0;
		System.out.print("scanning: ");
		
		while (true)
		{
			for (int i = START_IP; i <= END_IP; i++)
			{
				if (ping != null && ping[i] != null && ping[i].isAlive())
					openSockets++; 
			}
			
			//diff seit letztem Duchgang
			cache = ((int)((END_IP - openSockets) / ((float)(END_IP + 1) / 100))) - last;	// 255, damit es < 100% bleibt!
			
			// was gerade war merken
			last = (int)((END_IP - openSockets) / ((float)(END_IP + 1) / 100));
			
			for (int i = 0; i < cache; i++)
			{
				System.out.print(".");	
			}
			
			if (openSockets == 0)
				break;
			
			openSockets = 0;
			
			try
			{
				Thread.sleep(1);
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("100 %");
	}
}
```

Was ich aus dem Code oben genommen habe:
Wenn ein offener Port gefunden wurde, öffne ich diesen und speichere die Antwort. Danach zeige ich an, an welcher IP ein Gerät ist und über den geöffneten Port wird angezeigt welche Firmwareversion darauf läuft.


----------

