# UDP / DatagramPacket



## BigBoss (27. Nov 2006)

hi,

Ich habe folgendes Problem
Ich möchte ein keines serverquerytool schreiben das mit verschiedene eingenschaften meiner gameserver ausließst und in eine DB schreibt.
Ich habe jetzt versucht mit einem DatagramSocket eine verbindung aufzubauen und den Server so anzuspechen.
Laut dem serverlog ist nichts bei dem Serverangekommen, aber es ist aufjedenfall auf dem rootserver ein UDP packet eingetroffen. Bei längem überlegen bin ich dann daraufgekommen das der server ja auch nichs anzeigen kann da er ja ein DatagramPacket bekommen haben muss und diese erst entpackt werden muss. Kennt jemand eine möglichkeit wie ich eine UDP verbindung aufbaue ohne die Daten in ein solches DatagramPacket zu verpacken?, gibt es eine andere Klasse um ein UDP verbindung aufzubauen oder ist das Grundsätzlich nicht möglich?

mfg
BigBoss


----------



## thE_29 (28. Nov 2006)

Also ich kann mit dem Datagrampacket mit einem C++ Services prima kommunizieren...

Müsste also an was anderes liegen!


----------



## BigBoss (28. Nov 2006)

könntest du mir einmal den Code posten den du zum senden an dein c++ prog verwendest?
ich komm da im mom einfach nicht weiter hier mal mein code den ich mir zusammengesucht habe


```
import java.net.*;
public class Client 
{
	public static void main(String[] args) 
	{
		byte[] data = "0xFF0xFF0xFF0xFFinfo0x00".getBytes();
		try
		{
			InetAddress ia = InetAddress.getByName("localhost");
			int port = 27015;
			DatagramPacket p = new DatagramPacket(data, data.length, ia, port);
			System.out.println( "Paket addressiert an " + p.getAddress() + " an Port " + p.getPort() + "\n" + "Mit " + p.getLength() + " Byte: " + new String(p.getData()));
			DatagramSocket socket = new DatagramSocket();
			socket.connect(ia, port);
			socket.send(p);
			System.out.println("weg");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
```
thx
BigBoss


----------



## thE_29 (29. Nov 2006)

```
SocketAddress adr = null;

    try
    {
      adr=new InetSocketAddress(strIp,2721); 2721!!

      byte b[] = new byte[4];
      b[0] = (byte)iKas_nr; //merkt sich im 1ten byte den ersten Teil der kassennumer
      b[1] = (byte) (iKas_nr >> 8); //im 2ten byte, den 2ten Teil des short werts
      b[2] = 25;

      if(data != null && data.length() > 0)
        b[3] = (byte)data.charAt(0);
      else
        b[3] = (byte)'A'; //default ist ein A

      DatagramPacket packet;
      packet = new DatagramPacket(b,(int)b.length,adr);
      DatagramSocket tmpSocket = new DatagramSocket();
      tmpSocket.send(packet);
//.....
```

Also ganz normal!

Problem ist nur das C Little Endian und Java Big Endian verwendet!

Dies ist aber nur bei Zahlen, etc wichtig!


----------



## BigBoss (30. Nov 2006)

Besten dank,
Hab es es jetzt hinbekommen
Hab aber jetzt ein anderes problem
Ich wende dem Server einen String, dieser kommt auch an und wird auch an mich zurückgesendet bloß kommt dieser bei mir niemals an also mein Client wartet vergebens auf eine Antwort. Das Passiert aber anscheinend nur wenn der sich Server und Client im selben Netz befinden, aber auch wenn sie auf der Selben Maschiene sind.
Ein Problem mit der FW kann ich damit ausschließen. Der Cod funzt wenn ich den Client bei mir starte und den Server auf einem Root - Server laufen habe.
Kennt jemand das Phänomen?
Ich weis nicht ob es etwas mit der Zeit zutun hat die Die Pakete brauchen um von Server zum Client zu kommen. Ich kanns mir nicht so wirklich vorstlellen ist aber die einzige Möglichkeit die mir einfällt warumd er Client nix bekommt.

Hier mal noch mein Code:

```
import java.net.*;
public class Client 
{
	public static void main(String[] args) 
	{
		byte[] data = "\u00FF\u00FF\u00FF\u00FF rcon\"test\"info".getBytes();
		try
		{
			InetAddress ia = InetAddress.getByName("192.168.0.1");
			int port = 20200;
			DatagramPacket p = new DatagramPacket(data, data.length, ia, port);
			DatagramSocket socket = new DatagramSocket();
			socket.connect(ia, port);
			socket.send(p);
			socket.disconnect();
			int tport = socket.getLocalPort();
			socket.close();
			DatagramSocket sSocket = new DatagramSocket(tport);
			while (true)
			{
				DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
				sSocket.receive(packet);
				int len = packet.getLength();
				byte[] Sdata = packet.getData();
				System.out.println(new String(Sdata,0,len));
			}//ende while
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}//ende try
	}//ende main
}//ende class Client
```
Gruß BigBoss


----------



## BigBoss (2. Dez 2006)

so habs hinbekommen musste nur den selben Socket zum senden und Empfangen nehmen
thx nochmal
Gruß BB


----------

