Maximale UDP-Paketgröße
Übersicht

MiKotBetreff: Maximale UDP-Paketgröße |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi, für ein Multiplayerspiel will ich, dass vorher beim Login der Server die Karte via UDP an die Clients sendet. Wieviele Bytes sollte ich in den Stream schreiben, bevor ich ihn mit SendUDPMsg abschicke? Wird das irgendwie fehleranfälliger oder unverhältnismäßig langsamer wenn ich ein ganzen MB da reinstecke? | ||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich empfehle dir, sowas mit TCP zu machen. Da kann es zwar im extrem-Fall ein paar Sekunden dauern, bis alles angekommen ist, dafür kommt aber auch alles an. Bei UDP geht mit ein wenig Pech mal eben die Hälfte verloren und dann stehst du da mit der halben Map.
Dann brauchst du dich auch nicht mehr darum kümmern und kannst gleich alles auf einmal schicken. -> 2 Fliegen mit einer Klappe ![]() |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich würd auch sagen bei 1 MB geht dir die hälfte im web verloren... | ||
MiKot |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich würd mich aber eigentlich gern auf ein Protokoll beschränken und UDP is nunmal zum Zocken dann im Spiel das bessere. Ob die Karte vollständig angekommen ist, kann ich hinterher mit einer Checksumme prüfen.
Was ich noch gerne wüsste: Wenn der Client jetzt noch ein Holzmodem hat und der Server DSL, kann es dann sein, dass der Server schickt und schickt und schickt und das staut sich irgendwo in der Leitung und am Ende geht alles verloren? Oder wartet SendUDPMsg? |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, SendUPGMsg wartet nicht, sondern pumpt alles einfach in die Leitung. Deshalb sollst du ja TCP benutzen ![]() Und zwei anstatt einem Protokoll ist doch auch nicht weiter schlimm. Ausserdem kannst du den Tcp-Stream dann gleich noch für andere Sachen benutzen, die auf alle Fälle ankommen sollen(z.B. Chat-Nachrichten). |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
willst du denn die map während des spiels verschicken oder was graut dich vor TPC? | ||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bist du so blöd, oder tust du nur so FTC?
Erst laberst du nach, was ich bereits schrieb, und dann fragst du was, was er im ersten Post schon geschrieben hat. |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt ne Paketgröße bei UDP, die du beachten musst. Im 100er Netzwerk liegt das bei ~7000 Byte. D.h. du musst erst gucken, wie groß die Datei ist, dann teilst du das durch die paketgröße und sendest packet für packet. Natürlich wartest du vor dem Senden eines neuen Packetes auf Antwort vom Empfänger, ob er das Packet erhalten hat.
Ich mach es so: Code: [AUSKLAPPEN] Function receivefile$(ip, port)
st$ = ReadString$(readstream) writelog("Empfange die Datei "+st$) packagesize = ReadInt(readstream) fsize# = ReadInt(readstream) If packagesize>fsize Then packagesize = fsize pakete = Ceil(fsize#/packagesize) f = WriteFile(st$) For a=1 To pakete responsetimer = MilliSecs() + 2000 While Not RecvUDPMsg(readstream) If MilliSecs()>responsetimer writelogerror("Datei konnte nicht empfangen werden") CloseFile f :DeleteFile st$ Return "" End If Delay 10 Wend For b=1 To packagesize byte = ReadByte(readstream) WriteByte f, byte Next WriteString sendstream, "RECEIVEDPACKAGE "+a SendUDPMsg sendstream, ip, port Next CloseFile f writelog("Datei wurde erfolgreich empfangen",0,255,0) Return st$ End Function Function sendfile(st$, ip, port) If connected packagesize = 7000 If FileType(st$) writelog(st$+" wird gesendet...") ; Bereitet den Empfänger auf die Datei vor WriteString sendstream, "INCOMINGFILE" ; Filter den Teil vor der Datei heraus ( Z.B. wenn man versehentlich Currentdir$() mit sendet" temp$ = CurrentDir$() For a=1 To Len(st$) If Mid$(temp$,1,a)<>Mid$(st$,1,a) Then st$ = Right$(st$,Len(st$)-a+1) : Exit Next ; Sendet den Dateipfad, Paketgröße und Dateiname WriteString sendstream, st$ WriteInt sendstream,packagesize WriteInt sendstream,FileSize(st$) SendUDPMsg sendstream, ip, port ; Sendet die Datei f = ReadFile(st$) While Not Eof(f) For a=1 To packagesize byte = ReadByte(f) WriteByte sendstream, byte If Eof(f) Then Exit Next SendUDPMsg sendstream, ip, port responsetimer = MilliSecs() + 4000 While Not newip If MilliSecs()>=responsetimer Then Exit newip = RecvUDPMsg(readstream) If newip = ip ReadString$(readstream) : Exit Else If newip<>0 Print DottedIP$(newip) While Not Eof(readstream) Print ReadString$(readstream) Wend If findclient(newip) Then client\pingtimer = MilliSecs() newip = 0 End If End If : Delay 20 Wend If newip = 0 Then writelogerror("Senden fehlgeschlagen") : Return False newip = 0 Wend CloseFile f writelog("Datei wurde erfolgreich gesendet",0,255,0) Else writelogerror("Die Datei "+st$+" existiert nicht") Return False End If End If End Function Kannst du dir ja mal ansehen die beiden Funktionen. Gruß, Manu |
||
°_° °.° °~° °v° .. -.- |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann man es doch das gleiche wie tcp es schon eingebaut hat ![]() |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur dass TCP +BlitzBasic = Spielbremse schlechthin. Leider.
Achja und bei mir ists so, dass Pakete ab ca. 1kb nicht mehr übertragen werden. |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eben, bei BB würde ich auch immer wieder auf UDP gehen und wenn du gut programmierst, geht auch nichts verloren. | ||
°_° °.° °~° °v° .. -.- |
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hat nicahts mit gut programmieren zu tun sondern mit Kapselungsprozessen
der Router im WAN das Pakete teilweise verloren gehen. Man man so geballtes Halbwissen erlebe ich auch selten ![]() Im kleinen Heimnetzwerk mit 5 PCs geht die Fehlerquote bei UDP fast schon gegen 0. TCP ist natürlich ne schicke sache. UDP Pakete haben inkl IP und UDP Header eine maximale Größe von genau 65508 Bytes, eine Zahl die man sich mal merken sollte. IP Header 20 Bytes und UDP Header 8 Bytes. Nur mal so nebenbei ![]() IMurDOOM |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aha, hat also nichts mit gut programmieren zu tun wa? Dann kann ich ja mal eben 5Gig in ein Paket stopfen und mal sehen, wie schön es dann beim anderen ankommt. Und achja, die Fehlerroutine hilft dabei ja auch garnich, wenn was schief geht und der nochmal anfordert. Nein, nein das hat ja alles nichts mit gut programmieren zu tun... | ||
°_° °.° °~° °v° .. -.- |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also Matrix, jetzt muss ich auch mal einhaken.
Wieso sollte die maximale Paketgröße von der Bandbreite abhängen??? IMurDOOM hat bereits gesagt, dass die maximale Paketgröße bei 65536-8 Byte UDP - 20 Byte IP liegt. Somit 65508 Byte. UDP hat eine geringe Fehlerquote, TCP hat eine vollkommene Sicherheit, dass alles ankommt. Also TCP nur bei WICHTIGEN Daten nutzen. Bei 100 Versuchen mit UDP werden 99 aufwärts funktionieren. |
||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und wieso kann ich dann nich über 7000 Bytes per sendudpmsg versenden? Sende mal eine Datei die z.b. 1MB groß ist. Da kommen dann nicht mehr als 7000Bytes an! | ||
°_° °.° °~° °v° .. -.- |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Holzchopf hat Folgendes geschrieben: Achja und bei mir ists so, dass Pakete ab ca. 1kb nicht mehr übertragen werden.
Das ist, was die Praxis bei mir gezeigt hat. IMurDOOM hat Folgendes geschrieben: UDP Pakete haben inkl IP und UDP Header eine maximale Größe von genau 65508 Bytes, eine Zahl die man sich mal merken sollte.
Und ich nehme mal an, das ist, was Wikipedia sagt. Oder hast du es selber schon mal mit 65508Bytes pro Paket versucht? Nunja, wie dem auch sei, es würde verdammt schwierig, so zu programmieren, dass das Programm die maximale Paketgrösse selber ermittelt. Bleibt aber wohl nichts anderes übrig. Denn offenbar scheint diese Paketgrösse sehr unterschiedlich zu sein (je nach System). Und Matrix, habe ich dich richtig verstanden? Zu steckst 1MB in ein Paket, sendest das, empfängst dann aber nur 7000Bytes? Wie geht denn das? Ich habs noch nie erlebt, dass Pakete verstümmelt werden, die kamen immer entweder ganz oder gar nicht an (zu grosse Pakete natürlich gar nie). |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, Wikipedia sagte einst was anderes bis ich es änderte Holzchopf.
Es nicht schwer sich die Größen der Header und die Größe des maximalen IP Paketes zu wissen. Nur mal so als rechtfertigung mir anzumaßen das ich bei wiki geguckt hab. Bei UDP tritt auch bei BNetEx auf, das nicht mehr als knapp 8kB gesendet werden können. Das scheint irgendwie mit dem Treiber oder den Barkeley- Sockets zusammen zu hängen, vertex und ich haben da noch keine Lösung bzw noch keinen Fehler gefunden, der scheint Betriebssystemabhängig zu sein. In der realität kommt es ja auch so recht selten vor, das 1 UDP paket 65kB groß ist. IMurDOOM |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
IMurDOOM, natürlich haben wir dazu eine Lösung gefunden, und ich konnte auch schon 64KByte Pakete in einem ruck senden ![]() Ich kenne ja dieses schäbige Modul von Mark aus BMax und ich denke auch nicht, dass er in BlitzBasic annähernd das besser programmiert hat. Hier, das ist der Schlüssel, der die 7-8 KByte Grenze auf ca. 64KByte erhöht: Code: [AUSKLAPPEN] Size = 1% Shl 16 - 9
If setsockopt_(Self.Socket, SOL_SOCKET_, SO_RCVBUF_, Varptr(Size), 4) = SOCKET_ERROR_ Or .. setsockopt_(Self.Socket, SOL_SOCKET_, SO_SNDBUF_, Varptr(Size), 4) = SOCKET_ERROR_ Then closesocket_(Self.Socket) Return False EndIf Wenn Mark diese beiden Befehle nicht verwendet(ich musste lange danach rechachieren), dann gibt es Betriebsystem die die Paketgröße vor. Bei mir sind es beispielsweise immer 8192 Byte gewesen. Wenn man an das Socket-Handle kommen könnte, wäre es auch möglich, die Paketgrößen in BlitzBasic auf Maximum zu bringen. Hast du übrigens mal einen Artikel, wo drin steht, wieso überhaupt UDP Pakete verloren gehen? Das Pakete vertauscht oder fehlerhaft ankommen, schließe ich mal aus. Es gibt ja genügend Checksummen, und die Fragmentnummern werden auch mit gesendet. mfg olli |
||
vertex.dreamfall.at | GitHub |
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
Einene Artikel habe ich schon, ist aber in meinen Cisco Networks Seminars
Unterlagen und die darf ich hier nicht publizieren. Viele Router im WAN haben eine Serielle schnittstelle zu einem anderen Router auf genau 1 Interface, also eine 1:1 verbindung, hier entstehen wenig Fehler da es einen vorgeschriebenen Takt gibt um die Daten zu versenden. Natürlich im Duplexmodus. Das Problem tritt bei den Routern auf, die via Ethernet oder einer anderen Schnittstelle verbunden sind die beispielsweise mit CSMA/CD arbeitet. Hier ist das Problem das jeder Host der mit auf der Leitung sitzt senden kann wann er will, wobei er natürlich vorher überprüft ob jemand anders sendet. Nicht selten kommt es hier dann zu überschneidungen das mehrere Hosts gleichzeitig gesendet haben. Das Signal überlagert sich und verursacht Störungen im Nutzsignal, logisch. Nun fangen die Hosts die diese Überschneidung entdeckt haben an, ein JAM Signal zu senden, dieses JAM Signal wird eine gewisse Zeit gesendet, damit jeder Host auf der Leitung bemerkt, das eine Kollision aufgetreten ist. Das UDP Paket wird verworfen... So einfach ist das, es gibt natürlich noch viel mehr Möglichkeiten die ein UDP Paket verschwinden lassen. TCP Pakete verschwinden auch, aber der Empfänger fordert ja die nummerierten Pakete an und wenn der Host Paket 2-5 anfordert und nur 2-4 bekommt, fordert er beim nächsten mal 4-7 an, so merkt auch der Sender das wohl 1 Paket das zeitliche segnete. Wer noch fragen hat: Fragen! IMurDOOM |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Und Matrix, habe ich dich richtig verstanden? Zu steckst 1MB in ein Paket, sendest das, empfängst dann aber nur 7000Bytes? Wie geht denn das? Ich habs noch nie erlebt, dass Pakete verstümmelt werden, die kamen immer entweder ganz oder gar nicht an (zu grosse Pakete natürlich gar nie).
Genau so ist es aber leider. |
||
°_° °.° °~° °v° .. -.- |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group