Seite 1 von 2
Geschwindigkeitsfrage mit UDP und ReAllocateMemory
Verfasst: 20.11.2004 17:54
von MVXA
Hallo !
Ich hab ne kurze Frage. in meinem Programm möchte ich was über UDP Übertragen und Empfangen. Soweit so gut. Hab alles eingebaut und mache mich nun dran an das Empfangen von UDP Daten. Jetzt kommt aber meine Frage. [c]UDPDataAvailable()[/c] liefert zurück ob was empfangen wurde und wie groß das Empfangene ist. ist es sinnvoller die Daten so abzufragen:
Code: Alles auswählen
DataAvailable = UDPDataAvailable()
If DataAvailable <> 0
*UDPBuffer = ReAllocateMemory(*UDPBuffer, DataAvailable+1)
UDPReceive(sckMain, *UDPBuffer, DataAvailable)
EndIf
oder den Puffer, *UDPBuffer eine feste Länge zuzuordnen und dann auf das ReallocateMemory() zu verzichten. Ich möchte die ganze Aufgabe möglichst schnell
und sicher durchführen.
Verfasst: 20.11.2004 18:04
von PMV
Laut der Hilfe von UDP wird von UDPReceive() und UDPWaitUntilReceive() wird ja -1 zurück gegeben, wenn der angegeben Buffer kleiner ist, als die Länge der erhaltenen Naricht. Solltest du dir also sicher sein, das die Naricht eine bestimmte länge nicht überschreitet, so sollteste aus geschwindigkeitsgründen eine feste länge angeben.
Kann die Naricht aber beliebig lang sein, solltest du das so machen, wie du es oben vorschlägst.
Es wäre vielleicht auch möglich, das Ergebnis auf -1 zu überprüfen und erst dann den Speicher zu vergrößern, wenn wirklich der aktuelle zu klein ist.
Wenn UDPReceive() und UDPWaitUntilReceive eine zu große Naricht erhalten, wird diese dann eigentlich bei dem Ergebnis -1 gelöscht, oder kann man die Naricht danach immer noch empfangen, ohne das der Sender die Daten neu versenden muss?
MFG PMV
Verfasst: 20.11.2004 18:29
von MVXA
ich mach es dann so das zuerst überprüft wird ob der Puffer langt. Und die Daten gehen nicht verloren wenn der Puffer nicht groß genug ist.
[Edit:]
der Code sieht dann so aus:
Code: Alles auswählen
If DataAvailable <> 0
If UDPReceive(sckMain, *UDPBuffer, DataAvailable) = -1
*UDPBuffer = ReAllocateMemory(*UDPBuffer, DataAvailable+1)
UDPReceive(sckMain, *UDPBuffer, DataAvailable)
EndIf
EndIf
Ich Frage nur nach weil ich mir etwas unsicher bin, ob das ReAllocateMemory auch jedes mal erfolgreich durchgeführt wird oder es auch des öfteren Fehlschlägt.
Verfasst: 20.11.2004 18:52
von PMV
ReAllocateMemory() wird vermutlich nur fehlschlagen, wenn nicht genug speicherplatz da ist. Dann bleibt der alte ja bestehen, und selbst wenn das ganze funktioniert, bleibt die alte ID. Also sollteste nicht das Ergebnis des ReAllocateMemory() über die vorhandene MemoryID schreiben

.
Teste doch einfach mit
Code: Alles auswählen
If ReAllocateMemory() = -1 : debug "Fehlgeschlagen" : EndIf
, ob das funktioniert, oder nicht ... wenns nicht funktioniert kannste ja noch nen paar mal versuchen, bis es klappt, oder irgend wann halt Fehlermeldung rausbringen.
So sollteste auf der Sicheren seite sein

und die eine Zeile mit der IF abfrage sollte dann auch nicht so viel geschwindigkeit rauben, da das ReAllocateMemory() ja eh nötig ist
MFG PMV
Verfasst: 20.11.2004 19:13
von GPI
Schnell und sicher wiederspricht sich ein bischen.
TCP: Es wird eine Verbindung zur Gegenstelle aufgebaut und er empfang der Daten wird bestätigt, gegebenfalls neu angefordert.
UDP: Es werden die Daten mit einer Zieladresse auf gut Glück abgeschickt. Eine Empfangsbestättigung findet nicht statt! Dafür ist es sehr viel schneller und wahr ursprünglich nur für Fehlermeldungen gedacht. Bei Lokalen Netzwerken dürfe die Wahrscheinlichkeit, das etwas nicht ankommt, ziemlich gering sein, über WAN (Internet) kann es anders aussehen. Sollte man halt beachten.
Verfasst: 20.11.2004 20:35
von MVXA
Das interessante an UDP ist ja diese schlampigkeit. Freund und ich spielten mal über LAN ein spiel und aus meinem NB ist der LAN-Stecker rausgefallen. Hab ich erst gemerkt als das Spiel meldete das es den Server nicht mehr kontaktieren konnte. Hab ich einfach den Stecker wieder rein gesteckt und das Spiel ging ohne neuverbindung mit dem gleichem Server weiter. Schon interessant, oder ?
Verfasst: 20.11.2004 21:12
von PMV
Ohne neuverbinden. Kennste die Arbeitsweise (Quellcode) des Spiels, ich glaub eher weniger

, oder?
Viel mehr hat das Spiel nach dem erhalt der Naricht, dass der Server nicht mehr gefunden werden könnte, immer wieder versucht, zum Server zu Connection, ohne das du es gemerkt hast und als es dann wieder ging, dort weiter gemacht, wo es stehen geblieben ist.
Also würd ich das dann eher so sehen, das du weiter spielen konntest, ohne das Spiel neu Starten / Laden zu müssen
Und das ginge mit TCP/IP auch
Oder geht das, was LittleFurz geschreiben hat, wirklich mit UDP?
MFG PMV
Verfasst: 20.11.2004 21:41
von MVXA
mmmh, könnte auch sein. Aber das ist in sehr vielen Spielen so (z.b. Enemy Territory). Da kann mal kurz die Verbindung reißen weil der Server nicht mehr erreicht wurde oder sonst was und das Spiel nimmt nach 2 sek. wieder den Datenfluss wieder auf. (Anticheat system kicken da aber einen meistens auf grund magels eines Packetflusses... -_-)
Verfasst: 22.11.2004 17:30
von MVXA
mmmmmmh, interessant. Irgendwie gibt [c]UDPDataAvailable()[/c] nicht mehr wie gestern die Größe der Daten zurück, die im Buffer sind
Wenn PureFan das liest: Kannst du die Hilfe erneuern und alle Funtionen exakt dokumentieren ? BITTTTTE >___<
Verfasst: 22.11.2004 19:10
von DarkDragon
Hmm... wie habt ihr denn die Lib unter PB3.92 zum laufen bekommen? Ich bekomm nur nen LinkerError.