Maximale UDP-Paketgröße

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

MiKot

Betreff: Maximale UDP-Paketgröße

BeitragSa, März 17, 2007 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, März 17, 2007 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragSa, März 17, 2007 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würd auch sagen bei 1 MB geht dir die hälfte im web verloren...
 

MiKot

BeitragSa, März 17, 2007 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, März 17, 2007 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, SendUPGMsg wartet nicht, sondern pumpt alles einfach in die Leitung. Deshalb sollst du ja TCP benutzen Wink
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

BeitragSa, März 17, 2007 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
willst du denn die map während des spiels verschicken oder was graut dich vor TPC?

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, März 17, 2007 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 17, 2007 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 17, 2007 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
dann man es doch das gleiche wie tcp es schon eingebaut hat Laughing
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

Holzchopf

Meisterpacker

BeitragSa, März 17, 2007 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

TheMatrix

BeitragSa, März 17, 2007 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Eben, bei BB würde ich auch immer wieder auf UDP gehen und wenn du gut programmierst, geht auch nichts verloren.
°_° °.° °~° °v° .. -.-

Hummelpups

BeitragSa, März 17, 2007 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz

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 Wink

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

TheMatrix

BeitragSo, März 18, 2007 1:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 18, 2007 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

TheMatrix

BeitragSo, März 18, 2007 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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° .. -.-

Holzchopf

Meisterpacker

BeitragSo, März 18, 2007 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Hummelpups

BeitragSo, März 18, 2007 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 18, 2007 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
IMurDOOM, natürlich haben wir dazu eine Lösung gefunden, und ich konnte auch schon 64KByte Pakete in einem ruck senden Razz

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

BeitragSo, März 18, 2007 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 18, 2007 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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° .. -.-

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group