UDP Server - mehrere Pakete auf einmal

flash2910

Mitglied
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?:
Code:
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
 
Bis zu einem gewissen Maß werden die Pakete von Nic/OS gepuffert. Wenn der Puffer voll ist, dann werden Pakete weggeworfen.
 
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?
 
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.
 
Thread 1
Java:
while(!ende)
{
    byte [] data = empfange_paket();
    queue.enqueue(data);
}

Thread 2
Java:
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
 
hmm, folgende idee:

Receiver-Thread:
Code:
while(true) {
data=receive();
engine.add(data);
}

Engine-Thread:
Code:
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? =)
 
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
 
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
 
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

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

bzw.

Code:
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?
 
ja - 2. Thread schlafen legen wenn nichts mehr ansteht ... der 1. Thread kann ihn dann ja aufwecken wenn wieder Arbeit da ist
 

Zurück
Oben