# RCON Tool für Gameserver



## hgmichael (31. Mrz 2008)

Hallo,

ich habe vor mir ein kleines  Tool zu machen, mit dem nur einen Befehl an einen Server senden möchte..

Nach Konsultation meiner Fachlektüre und Google ist das wohl nur über ein DatagramPacket möglich. Habe mir dazu nach bestem Wissen auch etwas zusammengebastelt nur irgendwie kommt beim Server wohl nichts an (in der shell konsole sollte was passieren).


```
import java.net.InetAddress;
import java.net.*;
import java.util.*;

public class rcon {


    public static void main(String[] args) throws IOException, InterruptedException {
       
        InetAddress ia = InetAddress.getByName("xxx.xxx.xxx.xxx");
       
        while (true)
        {
        String s ="rcon login\"passwort\" status";
        byte[] data = s.getBytes();
        DatagramPacket packet = new DatagramPacket (data, data.length, ia, 41000);
        DatagramSocket toSocket = new DatagramSocket();
        toSocket.connect(ia, 41000);
        toSocket.send(packet);


        }
}
}
```


Habe mich auch hier im Forum umgesehen und bin dabei auf diesen Beitrag gestoßen. Leider bringt mich das der Lösung nicht näher.


http://www.java-forum.org/de/viewtopic.php?t=40083&highlight=rcon

Ports sind bei mir alle offen, daran kann es also nicht liegen. Für einen Verbesserungsvorschlag wäre ich dankbar.[/code]


----------



## HoaX (31. Mrz 2008)

schön dass du ein paket sendest ... aber wer empfängt es denn?!


----------



## hgmichael (31. Mrz 2008)

der gameserver xxx.xxx.xxx.xxx:41000 sollte es empfangen aber es kommt anscheinend nicht an


----------



## Pappenheimer++ (31. Mrz 2008)

Tja, was heißt hier anscheinend? Das Problem bei UDP ist ja, dass du kein ACK auf der Transportschicht zurückkriegst. D.h. man kann deinem Client hier ja nicht ansehen, ob das Paket angekommen ist. In dem Code hier sehe ich keine Fehler, also: Ist der Server von dir? Bist du ganz sicher, dass das nicht angekommen ist? Oder vllt hast du nur was gesendet, was nicht dem Application-Layer-Protocol des Servers entsprach und daher still und heimlich verworfen wurde?


----------



## hgmichael (31. Mrz 2008)

danke für die antwort.

der server ist von mir und während der läuft schaue ich bei meinen test in die konsole des selbigen. ich habe mit einem anderen porgramm einfach mal müll geschickt und es stand im server zumindest, dass von ip xxxxxxxx das und das geschickt wurde und der befehl nicht bekannt ist.

wenn ich nun mit meinem tool was schicke passiert gar nichts. dass paket nicht das richtige format hat kann ich natürlich nicht ganz ausschließen. werde mal mein google nochmal quälen und dann berichten.


----------



## HoaX (1. Apr 2008)

nimm ein programm ala tcpdump und schau nach ob es ankommt


----------



## hgmichael (1. Apr 2008)

danke, werde es mal versuchen. netzwerk ist bis jetzt noch nicht so meine stärke


----------



## Sheppard (30. Sep 2008)

Hallo,

ich habe auch ein Problem bezüglich Datenempfang!

Ich habe folgende Methode:


```
public static String sendRcon(String address, int port, String password, String command) throws SocketException, IOException {
        byte[] header = { (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff };
        byte[] body = ("rcon " + password + " " + command).getBytes();
        byte[] buf = new byte[1024];
        System.arraycopy(header, 0, buf, 0, header.length);
        System.arraycopy(body, 0, buf, header.length, body.length);
        DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress(address, port));
        DatagramSocket ds = new DatagramSocket();
        ds.send(dp);
        ds.receive(dp);
        String data = new String(dp.getData());       
        return data;
    }
```

sie funktioniert soweit, wenn ich die Methode folgendermaßen aufrufe:


```
public static String getServerName() 
    {
    	String name = null;
    	try 
    	{
           name = sendRcon("195.225.198.150", 28970, "rconPasswortr", "sv_hostname");
        } 
    	catch (Exception e) {e.printStackTrace();}
		
    	name = name.substring(29);
    	String[] tokens = name.split("\" default:");
    	name=tokens[0];
    	return name;
    }
```

Die Ausgabe ist dann der Server-Name. Also die gesendete Anfrage wird korrekt übermittelt und das empfangene Paket korrekt ausgewertet.

Nun habe ich in meinem Programm mehrere solcher Methoden wie getServerName() z.B. getMaxClients() diese Methode funktioniert ebenfalls.



Mein Problem ist, wenn ich nun beide Methoden aufrufe:

Beispiel main


```
public static void main(String[] args) 
    {
    	String hostName = getServerName();
    	String maxClients = getMaxClients();
    	
    	System.out.println(hostName+" "+maxClients);
        
    }
```


dann startet das Programm es gibt aber keine Ausgabe und das Programm endet auch nicht wieder von alleine!?


Ich wäre sehr Dankbar für Tipps


MfG Sheppard


----------



## Sheppard (30. Sep 2008)

Keine eine Idee???


----------



## HoaX (30. Sep 2008)

mal den debugger genommen wos hängt? bzw debugausgaben eingebaut?

eine vermutung wäre dass du nach ds.receive noch ein ds.close aufrufen musst da sonst beim zweiten versuch das receive hängt da immernoch der andere socket auf den port gebunden ist. wobei da imho eigentlich ne exception fliegen sollte.


----------



## Dit_ (6. Okt 2009)

Habe das gleiche Problem... socket.close() bringt nichts


----------



## Bohnenbrecher (14. Okt 2009)

Bei mir klappts mit dem gleichen Code wenn ich das Programm zwischendurch pausiere (eine oder eine halbe sekunde weiss nicht mehr genau) ...


----------

