# Zuviele TCP-Verbindungen



## rtt (31. Aug 2005)

Hallo,
ich habe einen Server geschrieben, der einige Socket-Verbindungen aufmacht. Danach sende ich meine Daten über diesen Socket und schließe den Strom und den Socket wieder.
Das funktioniert soweit ganz gut.
Nur wenn ich mir die TCP-Verbindungen (mit TCPView) ansehe, sind diese Verbindungen vom Status TIME_WAIT und werden erst nach einer gewissen Zeit wirklich beendet.

Das fürt zu meinem Problem.
Da ich innerhalb kurzer Zeit sehr viele Anfragen an den Server bekomme, werden auch innerhalb kurzer Zeit sehr viele TCP-Verbindungen geöffnet (und auch wieder geschlossen). Nun werden diese Verbindungen auf TIME_WAIT gesetzt und nach einer gewissen Zeit beendet. Allerdings werden während dieser Zeit weitere Verbindungen geöffnet.
So das sich nach einiger Zeit so viele Verbindungen auf TIME_WAIT befinden, das der Server die Arbeit einstellt.

Kann man diese Verbindungen sofort beenden (ich meine jetzt nicht mit close() ), so dass diese nicht erst einen Timeout abwarten?

Danke
Gruß Robin


----------



## Bleiglanz (1. Sep 2005)

na was jetzt? hast du einen eigenen Server geschrieben oder verwendest du den Apache...

ist übrigens normales Java-Verhalten, nach dem close noch ein bischen zu lauchen, abhilfe z.B. mit



> Specify a linger-on-close timeout. This option disables/enables immediate return from a close() of a TCP Socket. Enabling this option with a non-zero Integer timeout means that a close() will block pending the transmission and acknowledgement of all data written to the peer, at which point the socket is closed gracefully. Upon reaching the linger timeout, the socket is closed forcefully, with a TCP RST. Enabling the option with a timeout of zero does a forceful close immediately. If the specified timeout value exceeds 65,535 it will be reduced to 65,535.
> 
> Valid only for TCP: SocketImpl
> 
> ...



oder am Server mit SO_REUSEADDR


----------



## rtt (12. Sep 2005)

Hallo,
wenn ich Socket.setSoLinger(boolean, int) oder Socket.getSoLinger() verwende, bekomme ich immer eine SocketException, die sagt, das der Socket geschlossen ist.

Hier mal mein TestCode:

```
import java.io.*;
import java.net.*;


class SocketTest {
	
	public static void main(String[] args) {
		
		Socket sock            = null;
		OutputStreamWriter osw = null;
		String command         = "test";
		
		try {
			
			for (int i=0; i<10; i++) {
				sock = new Socket( "10.0.1.50", 80 );														
				osw  = new OutputStreamWriter( sock.getOutputStream(), "US-ASCII" );
				osw.write( command );											
				System.out.println( command );									
				
				osw.flush();													
				osw.close();
				
				System.out.println( sock.getSoLinger() ); 
				
				//sock.setSoLinger(true,0);
				
				// Socketverbindung schließen
				sock.close();
			}												
		}
		catch( IOException ioe ) {
			ioe.printStackTrace();
		}
	}		

}
```

Woran könnte das liegen. Welche Möglichkeiten gibt es noch?


----------



## rtt (12. Sep 2005)

Anscheinend liegt es am schließen des Streams.
Wenn man das weg lässt, funktioniert es mit setSoLinger(true,0);

Gruß Robin


----------



## Nick H. (12. Sep 2005)

wenn ich das richtig versteh solltest du einfach
setSoLinger vor osw.close() benutzen


----------

