# UDP-Verbindung, DatagramPakete



## Dit_ (8. Okt 2009)

Hallo!
Follgendes Problem


```
private final String HEADER_A = "ÿÿÿÿrcon ";
	private final String HEADER_U = "ÿÿÿÿ ";
	private String pw = "";
	private boolean mitRcon;
	private InetSocketAddress serverAdresse;
	private final String STATUS = "status";
	private final String GETSTATUS = "getstatus";
	private boolean stop;
	private String endDaten = "";

	

	public Verbindung(AktuellerServer aktuellerServer) {
		this.serverAdresse 	= aktuellerServer.getServerAdresse();
		this.mitRcon 		= aktuellerServer.isMitRcon();
		this.pw 			= aktuellerServer.getPw();
	}
	


public boolean rconGueltig() {

		if (pw.length() > 0) {
			DatagramSocket socket = null;
			DatagramPacket antwort = null;

			byte[] antw = new byte[127];
			byte[] in;
			try {
				in = (HEADER_A + pw).getBytes("ISO-8859-1");
			} catch (UnsupportedEncodingException e1) {
				// mach default dann
				in = (HEADER_A + pw).getBytes();
			}

			try {
				socket = new DatagramSocket();
				socket.send(new DatagramPacket(in, in.length, serverAdresse));
				socket.setSoTimeout(1000);
				antwort = new DatagramPacket(antw, antw.length);
				socket.receive(antwort);
				socket.close();
			} catch (SocketException e) {
				return false;
			} catch (IOException e) {
				return false;
			}

			String ausg;
			try {
				ausg = new String(antwort.getData(), 0, antwort.getLength(),
						"ISO-8859-1");
			} catch (UnsupportedEncodingException e) {
				ausg = new String(antwort.getData(), 0, antwort.getLength());
			}

			if (ausg.contains("Bad rconpassword.")) {
				System.out.println("wtf");
				return false;
			}
			// sonst
			return true;

		} else {
			return false;
		}
	}




public void holeDaten() throws IOException{
			
		DatagramSocket socket = new DatagramSocket();
		byte[] in = (HEADER_A + pw + " " + STATUS).getBytes("ISO-8859-1");
		/* SENDEN */
		socket.send(new DatagramPacket(in, in.length, serverAdresse));
		
		String endDaten = "";
		byte[] aus = new byte[1024];
		
		/* EMPFANGEN */
		while (!stop) {

			DatagramPacket antw = new DatagramPacket(aus, 0, aus.length);
			try {
				socket.receive(antw);
				socket.setSoTimeout(50);
			} catch (IOException e) {
				stop = true;
				break;
			}
			
			String fragmentString = new String(antw.getData(), 0, antw
					.getLength(), "ISO-8859-1");

			endDaten += fragmentString;
			
		}
		socket.close();
	}
}
```


wenn ich die methode *rconGueltig()* aufrufe macht sie alles richtig. True wenn passwort richtig ist und false wenn falsch...

wenn ich die methode *holeDaten()* mit einem richtigen passwort aufrufe macht sie ebenfalls alles richtig.

Aber wenn ich aber follgendes mache:

```
if ( rconGueltig()){
			holeDaten();
		}
```

dann wird zwar rconGueltig() ausgeführt, das programm bleibt aber beim holeDaten() hängen. 
Wie man sieht sockets sind geschlossen...

Weiss jemand was ich machen soll damit das funktioniert? Ich meine einzeln funktioniert ja alles aber zusammen nicht


----------



## tuxedo (8. Okt 2009)

Wenns einzeln geht und zusammen nicht: Bau mal einen Sleep von 300ms oder so ein.

Hatte ein ähnliches Phänomen schon mit der Teamspeak-Console und dem Telnet-Interface eines GameServers. 

Was anderes fällt mir gerade nicht ein ...

- Alex


----------



## Dit_ (8. Okt 2009)

OMG! wieso habe ich das nicht ausprobiert...
Danke tuxedo für den Tipp!

Fazit: 300 bis 500 ms wartezeit zwischen zwei DatagramAnfragen.


```
try {
			Thread.sleep(zeit);
		} catch (InterruptedException e) {
			macheWas();
		}
```

Für einen ETServer sollte man die wartezeit auf min 500 einstellen, damit alles wirklich reibungslos funktioniert.


----------



## tuxedo (9. Okt 2009)

"Normal" ist das nach wie vor nicht. In meinen Augen deutet das auf eine "schlechte" Implementierung auf Serverseite hin, oder eben unzureichende Dokumentation


----------

