# DatagramPackets mit Offset schicken!



## Guest (3. Dez 2004)

Hi @ all!

Will folgendes machen:
Ich will ein Packet schicken, wo in den ersten 4 Stellen des buffers (sendData) die Sequenz-Nummer abgespeichert ist und an den nachfolgenden Stellen irgendwelche Daten.

Ich bekomme aber immer eine IllegalArgumentException. Es funktioniert nämlich nur wenn der Offest 0 ist. ABer wie soll dann der Empfänger wissen, wieviel Stellen er rausparsen muss, damit er die Seq-Nummer erhält?!!

Unten die Problemzeile mit den Werten beim Aufruf darüber.



```
//new DatagramPacket(buffergröße = 1024, offset = 4, länge = 24, localhost, 3788);
sendPacket = new DatagramPacket(sendData, 4, datalength, clientAddress, port);
```


----------



## Grizzly (3. Dez 2004)

Ich verstehe leider nicht ganz, wie Du das meinst. Der von Dir verwendete Konstruktor erzeugt - wenn ich die API richtig verstanden habe - ein DatagramPacket mit den Daten aus dem Array, beginnend am Offset mit der angegebenen Länge. Außerdem wird das DatagramPacket mit einer Ziel-Adresse und einem Ziel-Port versehen.

Du kannst die Sequenz-Nummer doch einfach in die ersten 4 Bytes Deines Arrays unterbringen. Mit dem Offset musst Du eigentlich gar nix machen. Die Gegenstelle bzw. der Empfänger muss dann halt wieder die ersten 4 Bytes als Sequenznummer interpretieren.


----------



## Guest (3. Dez 2004)

Aso, hab da anders gedacht. Hab gemeint, dass der Offset so eine Art Markierung für den Empfänger ist.

So dass der Empfänger weiß, dass im buffer 2 Sachen drin sind.


----------



## Guest (3. Dez 2004)

Hab noch eine Fragen:

Wie ist das dann mit dem length-Attribut.
Die Java-Api sagt das: The length argument must be less than or equal to buf.length. 


Wenn ich jetzt ein byte[] mit Größe 1024 in das Paket reinstecke und length auf 800 setze, schickt der Sender dann die kompletten 1024 bytes rüber? 800 sinnvolle bytes und die restlichen 224 sind dann irgendein byte-Müll. Der Empfänger kann dann mit DatagramPacket.getLength() abfragen, wie viel sinnvolle bytes geschrieben wurden, also 800. So hab ich mir's vorgestellt.

Oder verkleinert der Sender das byte[] auf 800, bevor ers wegschickt?


----------



## Grizzly (3. Dez 2004)

Anonymous hat gesagt.:
			
		

> [...]Wenn ich jetzt ein byte[] mit Größe 1024 in das Paket reinstecke und length auf 800 setze, schickt der Sender dann die kompletten 1024 bytes rüber? 800 sinnvolle bytes und die restlichen 224 sind dann irgendein byte-Müll. Der Empfänger kann dann mit DatagramPacket.getLength() abfragen, wie viel sinnvolle bytes geschrieben wurden, also 800. So hab ich mir's vorgestellt.
> 
> Oder verkleinert der Sender das byte[] auf 800, bevor ers wegschickt?



Du hast einen Array mit einer beliebigen Länge. Und mit dem Parameter offset und length gibst Du an, welchen Bereich aus dem Array Du versenden möchtest.
Beispiel:

```
// Der Array
byte[] daten = {0, 1, 2, 3, 4};
// Das DatagramPacket (address wäre eine InetAdress-Objekt, port vom Typ int)
DatagramPacket dp = new DatagramPacket(b, 1, 3, address, port);
```

Beim Empfänger würde dann ein DatagramPacket ankommen. Ein Aufruf der Methode getLength() wurde 3 als Ergebnis liefern, ein Aufruf der Methode getData() einen Array {1, 2, 3}.

Ich hoffe, dass ich damit Deine Fragen beantwortet habe  . Ansonsten: Einfach nochmal fragen  .


----------

