Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

21.05.2012, 10:05

Is natürlich alles auch eine Firewall-/Router-Frage, ob da was wo ankommt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

21.05.2012, 12:07

Aber noch eine andere Frage: Da UDP ja ein Verbindungsloses Protokoll ist, sollte ja auch jeder Client in der Lage sein,
jedem anderen Client direkt eine Nachricht zu schicken, ohne Umwege über den Server, oder!?

Um...ja, sobald der Client die IP vom Server kennt. Und was genau meinst du mit Umwegen?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

13

21.05.2012, 12:42

Mit Umweg:
ClientA sendet Nachricht für ClientB an Server und Server sendet die Nachricht weiter an ClientB

Ohne Umweg:
ClientA sendet Nachricht direkt an ClientB

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

21.05.2012, 12:46

Achso, ja natürlich. Deine Clients könnten aber auch untereinander TCP Verbindungen aufbauen...
TCP und UDP sind einfach zwei grundverschiedene Dinge. In erster Linie solltest du dir mal überlegen ob du eine sichere Verbindung brauchst oder nicht. Mit UDP kann auch mal ein Paket nicht ankommen. Mit TCP kommt dagegen, wenn nur irgendwie möglich, alles an und das auch noch in der richtigen Reihenfolge (mit UDP ist natürlich auch die Reihenfolge in der Pakete ankommen undefiniert)...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

15

21.05.2012, 13:28

Das war jetzt aber nicht die Antwort auf meine Frage. Die Grundlagen von UDP und TCP sind mir schon klar. Eben nur nicht, ob bei UDP jeder Client jedem anderen Client direkt Nachrichten schicken kann, weil das ja - wie bereits erwähnt - bei mir noch nicht geklappt hat.
In "Quake III" wurde z.B. UDP verwendet, wie das mit aktuellen Spielen ist weiß ich nicht. Wenn eine Spieler-Position in einem Frame mal nicht übertragen wird, macht das nichts.
Bisher hatte bei mir halt nur die Situation funktioniert: 1 Server und 1 Client. Da hat die Übertragen sehr gut funktioniert - trotz unsicherem UDP.
Denn dafür ist UDP deutlich schneller als TCP.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

21.05.2012, 13:30

Eben nur nicht, ob bei UDP jeder Client jedem anderen Client direkt Nachrichten schicken kann, weil das ja - wie bereits erwähnt - bei mir noch nicht geklappt hat.

Ja klar geht das.

In "Quake III" wurde z.B. UDP verwendet, wie das mit aktuellen Spielen ist weiß ich nicht. Wenn eine Spieler-Position in einem Frame mal nicht übertragen wird, macht das nichts.

Hängt vom Spiel ab. Bei einem Shooter wird man UDP verwenden, bei einem RTS dagegen wohl evtl. TCP.

Denn dafür ist UDP deutlich schneller als TCP.

Ist das so? Ich würde mal sagen das hängt auch wieder stark davon ab was genau man tut. Wenn du dir in deinem UDP basierten Protokoll am Ende erst wieder alle möglichen Methoden implementieren musst, um sicherzuerstellen dass Pakete auch ankommen, wirst du z.B. am Ende nicht wirklich was gewonnen haben, vermutlich sogar eher im Gegenteil...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

17

21.05.2012, 13:34

Moment ich glaube hier existiert ein kleines Missverständnis:
Man nutzt UDP zum Finden anderer "Spieler" in einem lokalen Netzwerk, weil man hier einfach Nachrichten an alle "erreichbaren" Computer senden kann (das so genannte Broadcasten). Angenommen dein Netzwerk würde aus 3 PCs bestehen (IPs sind 192.168.0.5, 192.168.0.6,10.0.0.1) und auf allen drei würde dein Programm auf den UDP Port 86567 laufen. Nun will der erste PC die anderen finden/fragen ob sie einen Server auf haben. Da er die IPs der anderen nicht kennt kann er auf das Broadcasten zurückgreifen (was es bei TCP nicht gibt), indem er beim Senden z.B. die IP 192.168.0.255 als Empfänger angibt. Die 255 steht dafür, dass sich alle PCs mit einer 192.168.0.x IP angesprochen fühlen. Somit können sich die beiden ersten PCs finden, aber der dritte bekommt nichts mit da er eine 10.0.0.x Adresse hat. Wenn der Broadcast aber an 255.255.255.255 geht, dann empfangen es alle.

Kurzfassung: Programm auf allen Rechner starten, suchende PCs schicken eine Anfrage an 255.255.255.255, antwortende PCs antworten auf die per recvfrom empfangene Adresse.

(Anmerkung: die Adresse 0.0.0.0 ist die Adresse an die man binden muss, wenn man von allen Interfaces Pakete erhalten will; habe ich im letzten Post durcheinander geworfen).

EDIT: dot hat definitiv recht. Nicht selten ist sogar TCP "schneller" (bessere Ausnutzung der Bandbreite); Siehe dazu mein kleines Testprojekt. UDP ist nur dann im Vorteil wenn ein Netzwerkmodell genutzt wird, was Paketverluste gut verkraftet und ohne Neusenden klarkommt.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

18

21.05.2012, 14:32

Ok, so langsam steige ich dahinter.
1.) Ich habe bei der Socket-Funktion "bind" immer die Server-IP angegeben. Aber bei UDP sollte man also in der Regel 0.0.0.0 verwenden, richtig?!
2.) Wenn ich zum broadcasten 255.255.255.255 angebe, ist das nicht etwas ineffizient? Ich hätte jetzt mal an 192.168.255.255 gedacht, da in einem lokalen Netzwerk ja normalerweise immer 192.168.x.x verwendet wird.
3.) Für meine Zwecke sollte UDP auf jeden Fall reichen. Gerade wenn man einen Server hat, der pro Frame die Position/ Rotation aller Physik-Objekte übertragen muss - da darf ein Packet auch mal in einem Frame nicht ankommen und die Reihenfolge ist auch nicht immer wichtig.
Selbes gilt mit Spieler-Positionen.
4.) Bei RTS hätte ich persönlich jetzt auch auf UDP getippt, weil da ja noch viel mehr Informationen gesendet werden müssen (siehe Warcraft 3 wenn da 100te Figuren rumrennen)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

19

21.05.2012, 14:52

2.) Wenn ich zum broadcasten 255.255.255.255 angebe, ist das nicht etwas ineffizient? Ich hätte jetzt mal an 192.168.255.255 gedacht, da in einem lokalen Netzwerk ja normalerweise immer 192.168.x.x verwendet wird.

Broadcasts werden von Routern üblicherweise (Standardeinstellung) nicht nach aussen geleitet, sondern nur im lokalem Netzt gesendet.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

20

21.05.2012, 14:59

(Anmerkung: die Adresse 0.0.0.0 ist die Adresse an die man binden muss, wenn man von allen Interfaces Pakete erhalten will; habe ich im letzten Post durcheinander geworfen).

Moment mir fällt gerade ein, ich hab bei den Clients für UDP nie die Socket-Funktion "bind" aufgerufen, sondern einfach direkt mit "sendto" Nachrichten gesendet.
Nur für den Server habe ich "bind" mit "INADDR_ANY" aufgerufen.
Wie soll ich also die Clients an 0.0.0.0 binden??

Werbeanzeige