# UDP Server - mehrere Pakete auf einmal



## flash2910 (12. Mrz 2011)

hallo zusammen,

ich habe mich gerade gefragt was ein DatagramSocket macht, wenn mehrere pakete fast gleichzeitig ankommen. gehen mir unter umständen pakete verloren, wenn ich die abfrage ungefähr so realisiere?: 
	
	
	
	





```
while(true) {
receive();
daten_an_anderes_objekt_weitergeben();
}
```

oder gibts da grundsätzlich ne bessere lösung?
ich habe mir überlegt, ob man vielleicht jedem Client einen eigenen Port zuweist und dann viele Receiver-Objekte erzeugen, von dem jeder an einem Port horcht(also für jeden Client nen Receiver-Objekt).

Freue mich auf Anregungen

Grüße

Ich


----------



## HoaX (12. Mrz 2011)

Bis zu einem gewissen Maß werden die Pakete von Nic/OS gepuffert. Wenn der Puffer voll ist, dann werden Pakete weggeworfen.


----------



## flash2910 (12. Mrz 2011)

hm, klingt gut. wie groß ist der buffer ca? =) sehr groß muss er nicht sein, meine datenpakete sind sehr klein(nie über 1kB) und ein Übertragungsbefehl dürfte nicht sehr lange dauern. sollte also eigentlich mit der while(true) schleife funktionieren oder?


----------



## HoaX (12. Mrz 2011)

Das hängt von der Nic/OS ab, aber ich würde so vom gefühl der von >=16kb ausgeben.
Aber das kannst du ja lokal einfach mal ausprobieren.


----------



## Gast2 (12. Mrz 2011)

*Thread 1*

```
while(!ende)
{
    byte [] data = empfange_paket();
    queue.enqueue(data);
}
```

*Thread 2*

```
while(!ende)
{
    byte[] data = queue.dequeue();
    verarbeitet_data();
}
```
schützt zwar immer noch nicht 100% vor Paketverlust ... allerdings hast Du einen Thread der direkt nur den Socket bedient ... ggf. muss due die Queue noch Synchronisieren


----------



## flash2910 (13. Mrz 2011)

hm, ich werd mir was ausdenken. danke für die idee schonmal


----------



## flash2910 (13. Mrz 2011)

hmm, folgende idee:

Receiver-Thread:

```
while(true) {
data=receive();
engine.add(data);
}
```

Engine-Thread:

```
byte[100][1000] buffer;
int pointer=0;
int length=0;

add(byte[1000] p) {
buffer[pointer]=p;
pointer++;
length++;
if(pointer==100) pointer=0;
if(length==101) length=100; //bei mehr als hundert elementen überlauf, el. werden gelöscht
}

byte[1000] get() {
if(length!=0) {
length--;
pointer--;
if(pointer==-1) pointer=99;
}
return buffer[pointer];
}

run() {
byte[1000] workdata;
while(true) {
workdata=get();
/*
workworkwork
workworkworkwork
*/
}
}
```

gute idee, schlechte idee? =)


----------



## Gast2 (13. Mrz 2011)

schlechte Idee ... weil Du viel mehr Synchronisieren musst ... ich glaube Java hat schon eine Queue die synchronisiert ... wenn nicht - ist auch mit entsprechendem Schlüsselwort schnell geschrieben


----------



## flash2910 (13. Mrz 2011)

was meinst du mit viel mehr? vom programmier- oder vom rechenaufwand?
weil ich denke der rechenaufwand ist so ziemlich minimiert. wenn ein
neues paket eintrifft, wird es in den buffer geschrieben.
die verarbeitungsroutine arbeitet währendessen mit ihrem eigenen tempo.
klappt doch prima.
schreib wenn ich falsch liege


----------



## flash2910 (13. Mrz 2011)

hm, habs mal so programmiert wie ich das geschrieben habe und so wie mogel mir das vorgeschlagen hat(hab die Klasse queue aber noch nie verwendet, deshalb mit nem array, aber ändert ja nichts), allerdings geht die Prozessorauslastung voll hoch, wohl wegen der Endlosschleife


```
while(!ende)
{
    byte[] data = queue.dequeue();
    verarbeitet_data();
}
```

bzw. 


```
while(true) { //hier geht die auslastung hoch, da die Schleife einfach endlos rennt
workdata=get();
/*
workworkwork
workworkworkwork
*/
}
```

hat irgend jemand ne idee wie man das besser machen könnte?


----------



## Gast2 (13. Mrz 2011)

ja - 2. Thread schlafen legen wenn nichts mehr ansteht ... der 1. Thread kann ihn dann ja aufwecken wenn wieder Arbeit da ist


----------



## flash2910 (13. Mrz 2011)

gute idee. wie mach ich das?
einfach mit .wait(); zum einschlafen und .start(); zum aufwecken?


----------



## Gast2 (14. Mrz 2011)

flash2910 hat gesagt.:


> gute idee. wie mach ich das?


Klick mich



> einfach mit .wait(); zum einschlafen und .start(); zum aufwecken?


probieren geht über studieren


----------

