Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:47

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Netzwerk
BeitragVerfasst: Fr Apr 06, 2007 08:11 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Ich frage mich gerade, was ich für ein Netzwerk eines Shooters benutzen soll, dabei geht es mir am anfang vor allem darum die Koordinaten der Spieler zu empfangen und zu versenden.

Dabei ist es wichtig, dass der server 1-n spielern etwas versendet, also mehr als 2 Spieler zusammen spielen können.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 08, 2007 12:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo,

also ich finde die Frage etwas sehr allgemein gestellt. Aber ok. Als erstes solltest Du Dich entscheiden, welches Protokoll Du nutzen willst. Also TCP oder UDP. Unterschiede, Vor- und Nachteile sind recht oft im Netz beschreiben und Du solltest gut analysieren und für Deine Zwecke das passende aussuchen. Man liest zwar überall, dass für Spiele nur UDP das wahre ist, aber man hat wohl auch schon gute Shooter gesehen, welche TCP nutzen.
Das war aber nur der Transportweg. Nächstes Problem ist die Information die Du übertragen willst. Und da hast Du alles unter Deiner Kontrolle. Gute Informationsquellen sind hier die SDL-Netzwerk-Tutorials falls es plattformübergreifend werden soll, oder der Quelltext von "Jagdgeschwader" von Sascha Willems, oder "Asteroids" von Magellan.

Genauere Aussagen kann ich Dir leider im Moment nicht geben, weil die Frage einfach zu allgemein ist.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 08, 2007 17:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
UDP für Shooter???
nee da kommt nur TCP in Frage. Wäre ja doof, wenn das Spiel nicht merkt, dass ein paar Pakete verloren gegangen sind.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 08, 2007 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ist verdammt einfach zu beantworten, es kommt als Daten Protokoll nur UDP in frage und als auth TCP/IP.
Wieso ?
Ganz einfach, wichtige Informatione, also die anmeldung beim Server muss gesichert sein.
Dies kann man auch über UDP lösen aber das ist ein bischen mit aufwand verbunden.
Nicht so kritische dinge wie Daten über das Spiel sind klar UDP.
TCP/IP ist einfach viel zu langsam, da die 3fache menge an Pakete rum schwirrt.
UDP ist ein sehr einfaches und Sessionloses Protokoll und so kann man mehere Daten pro Sekunde Senden. Es ist absolut unwichtig, ob mal ein Paket verloren geht, das kennt man als lag und fertig.

Als Library ist SDL_Net zu empfehlen, dies nimmt dir die Arbteit mit den Threads ab.
Jede Verbindung braucht ein Thread für Non-Blocking Verbindung.
SDL_Net übernimmt viel arbeit und ist einfach zu verwenden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 08, 2007 21:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Pellaeon hat geschrieben:
UDP für Shooter???
nee da kommt nur TCP in Frage. Wäre ja doof, wenn das Spiel nicht merkt, dass ein paar Pakete verloren gegangen sind.


Tja, sag ich mal nur eins: Quake3 UDP 27960. Das sollte als Argument reichen. (Ok, ich geb noch ein paar drauf. Alles von ID-Software, Battlefield, Halo, Jedi, Shogo, Unreal,...) :roll:
Aber wie TAK schon sagt. Der Aufwand ist bei UDP ein anderer als bei TCP.
Wenn Du etwas mit TCP machst, dann hast Du die Garantie, dass das Paket ankommt. Nachteil, wenn ein Client eine langsame Leitung hat, oder die Verbindung getrennt wird, dann hängt der Server und damit die ganze Partie.
Bei UDP kann das nich passieren, aber man hat unter anderem keine Garantie dass die Pakete ankommen. Also muss man hier teilweise andere Wege in der Programmierung gehen. Wenn bei TCP ein "schiessender Client" den Schuss direkt an den Server meldet, dann wäre das bei UDP anders zu lösen. Meine Herangehensweise in meinem Projekt "Hera7" (3D-Weltraum-Simu, also einem Shooter nicht unähnlich) war so ausgelegt, dass der Client feststellte wann der Spieler schiessen will (also die Taste gedrückt wurde). Diese Info hat der Client an den Server geschickt, und zwar so lange bis der Server den Schuß ausgelöst (also bestätigt) hat. Problem gelöst. Es muss schon verdammt dumm laufen, damit da was verloren geht.
Anderes Problem von UDP ist die Reihenfolge der Pakete. Die müssen nicht zwingend so ankommen wie sie gesendet wurden. Aber auch hier kann man sich helfen indem man die Pakete mit einer Sequenz versieht. Wenn "alte Pakete" für den gleichen Zwecke eintrafen (meinetwegen Bewegungstatus-Pakete), dann wurde das Paket einfach nicht ausgewertet. Auch hier kann ich das für das o.g. Projekt ein Beispiel nennen. In jedem Paket wurde die komplette Position, der Bewegungsvektor und die Drehung mitgeliefert. Selbst wenn 500ms keine neue Info vom Client kam, konnte der Server (und die anderen Clients) aus den "alten" Daten die neue Position des Clients rekonstruieren. Wenn nun wieder aktuelle Daten eintrafen, dann war der Sprung zwischen vorausberechneter Position und tatsächlicher Position absolut vernachlässigbar. Ich finde das wichtige bei UDP ist, mit einer evtl. verschobenen Reihenfolge klarzukommen und den Handshake des TCP irgendwie anders zu bewerkstelligen.

Ob der Nachteil von TCP nun wirklich so schlimm ist will ich in meinem aktuellen Projekt "Memorix" ausloten. Dort verwende ich TCP als Protokoll. Mal schauen. Ich vermute aber, dass es einfach nur geht.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Zuletzt geändert von DNA am Mi Jan 30, 2008 22:48, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 00:15 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Ist es denn möglich eine TCP und eine UDP Verbindung aufrechtzuerhalten?

Weil das ganze würde es insofern leichter machen, da ich alles was ankommen muss über TCP schicken kann und alles was nicht so wichtig ist (z.B. Ort eines Spielers usw.) könnte man über UDP machen.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
DNA hat geschrieben:
Pellaeon hat geschrieben:
UDP für Shooter???
nee da kommt nur TCP in Frage. Wäre ja doof, wenn das Spiel nicht merkt, dass ein paar Pakete verloren gegangen sind.


Tja, sag ich mal nur eins: Quake3 UDP 27960. Das sollte als Argument reichen. (Ok, ich geb noch ein paar drauf. Alles von ID-Software, Battlefield, Halo, Jedi, Shogo, Unreal,...) :roll:


Ja ok ich geb mich geschlagen :wink:
Hätt ich nicht gedacht, da ja UDP halt die schon erwähnten Nachteile hat

Zitat:
Ist es denn möglich eine TCP und eine UDP Verbindung aufrechtzuerhalten?


Klar kann dein Programm mehrere Verbindungen aufbauen. Wenn du es nativ machst, dann gehts über Sockets, ansonsten musst du dir halt einen Wrapper dafür suchen, das spart Arbeit und Frust^^

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 10, 2007 11:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Man muss sich schon mit den Protokollen beschäftigen, um sie anwenden zu können.
TCP über IP ist ein Session Protokoll mit Fehlerkorrektur,Paket zähler und Fehlererkennung.
Dies macht TCP sehr nützlich für kleine Datenmengen und sehr schlechte Verbindungen(z.B. WLan).
WLan hat ein sehr hohes Rauschen und die wahrscheinlichkeit für ein sogennanten Burst(Datenfehler in ein Rahmen/Paket). Hier sind Fehlerkorrektur absolut notwendig, da man nicht hoffen kann, dass beim nächsten Versuch das Paket heil ankommt. Die Fehlerkorrektur hat aber sein Preis, braucht Zeit und nimmt viel Platz im Rahmen weg(das letzte mir bekannte Fehlerkorrektur System macht aus 1kBit Daten,10.001Bit Daten).
UDP setzt viel niedriger im OSI Modell an also in der 3. Schicht(die Hardware macht Schicht 1-2 teilweise auch 3) und darüber kommen dann die Software Protokolle zum einsatz), also UDP gibt nichts vor(TCP gibt bis zur 6. Schicht vor). UDP ist Sessionlos(OSI Schicht 5 wäre Session). Dies macht folgendes aus, man gibt ein Server über UDP ein Port und der Client sucht sich ein noch offenen Port raus und schickt es an den Server auf den bestimmten Port. Das hat den Vorteil, dass man für Clients die FireWall ignorieren. UDP besitzt kleinere Rahmen also mehr Platz für Daten. UDP besitzt keine Fehlererkennung oder Fehlerkorrektur, also muss der Entwickler selber für sorgen. Da TCP mal ein ziemlich lahmes System besitzt, welches auf hohe Burst raten ausgelegt ist, eignet sich UDP mit kleinen erweiterung ein wesentlich besseren Durchsatz, welcher genauso sicher Daten verschickt. Denn der normale Anwender nutzt Glasfaser->Twisted Pair Kabel Verbindungen, wo das Rauschen und der daraus resultierende Burst fast nicht zu beachten ist. Mein Kumpel hat ein UDP mit Fehlererkennung und Paketzähler gebaut, die Daten kommen somit immer an und auch in richtiger Reihenfolge aber mit über 50% mehr Datendurchsatz. Fehlerkorrektur ist ein sehr böses Thema, es ist irre groß(mindestens 200%+1bit größer) und lohnt sich für den normalen Client-Server gebrauch in standard Netzwerken garnicht. Fehlererkennung braucht ledeglich 1bit für Parity Flag oder halt CRC(zu empfehlen), wo ich aus dem Kopf nicht die größe weiß.

UDP hat sich in der Spielebranche als Datentransport Protokoll durchgesetzt und TCP/IP wird für Sichere Daten versendung. z.B. Authentifizierung genutz(TCP/IP ist Session bassiert und ist damit die sichere wahl für eine Authentifizierung). Dieses Schema findet man in z.B. Blizzard Spielen, Half Life und vielen mehr wieder.

Wichtig ist am Ende nur, das man UDP um bestimmte Funktionalitäten selber erweitern muss und daraus eine Überlegung entsteht, was man mehr bedeutung gibt. Will man einfach nur ein Paar Pakete verschicken und fertig(TCP/IP) oder sich die Zeit nehmen und ein bischen selber Entwickeln(UDP).
Spiele, wo es notwendig ist, viele Pakete zu versenden also Shooter, dann führt kein weg um ein UDP und eigenen Software Schichten rum.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 13, 2007 12:10 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
eine weitere frage ist, wie empfange ich daten über TCP (SDL) da gibts ja die funktion "SDLNet_TCP_Recv", aber wie weiss ich ob noch daten da sind? Bei der ScktComp Unit von Delphi konnte ich dies über ein Callback machen: Socket.OnRead.


Dann noch eine Frage: Kann ich TCP und UDP die parallel laufen und auch parallel daten versenden (tcp wichtiges zeug, eher wenig, pro sekunde ein paar pakete; UDP die ganzen wichtigen Daten, Ort, Blickrichtung, Health) auf dem gleichen Port laufen lassen oder muss ich da einen unterschiedlichen nehmen?

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 13, 2007 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hi,

beide Fragen sind in folgenden Tutorials recht gut beschrieben und mit den zugehörigen Quellen schnell nachvollziehbar:

TCP und wie finde ich raus ob Daten anliegen:
http://www.pascalgamedevelopment.com/vi ... p?a=70&p=1

Wie mach ich das ganze mit UDP:
http://www.pascalgamedevelopment.com/vi ... p?a=70&p=1

Ich hatte auch ein Beispiel gefunden (Ein Timeserver wenn ich mich recht erinnere) in dem TCP und UDP gleichzeitig genutzt wurde. Das kann ich aber im Moment nicht finden.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 13, 2007 20:07 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Ich würde klar zu UDP tendieren.
Eine ausführliche Abhandlung wie Netzwerk in Unreal funzt:
http://unreal.epicgames.com/Network.htm
Am Anfang werden auch einfachere Verfahren vorgestellt, die jedoch großteils wohl nur LAN geeignet sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 14, 2007 00:19 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Ich tendier ja auch zu UDP :D

Rein vom Speed her bringt TCP überhaupt nichts.

Aber es gibt wichtige Sachen, wie z.B. Authentifizierung usw, die wirklich sehr wichtig sind und die ich nicht über UDP machen will, weil es das ganze viel komplizierter machen würde.

Wenn ich dann schon eine TCP Verbindung hab, ist es natürlich gut, wenn ich darüber auch wichtige Sachen wie z.B. Schüsse schicken kann. Da hat man ein paar pro Sekunde, das sollte das ganze nicht so ausbremsen.

@DNA:

Bei TCP meintest du vermutlich dies: http://www.pascalgamedevelopment.com/vi ... =1#article ;)

Aber vielen Dank, genau sowas hab ich gesucht.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 14, 2007 08:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Gaukler hat geschrieben:
@DNA:
Bei TCP meintest du vermutlich dies: http://www.pascalgamedevelopment.com/vi ... =1#article ;)

Genau. :) Ich sollte vermeiden beim Kopieren und Pastieren den Überblick zu verlieren. :)

Das von mir angesprochene UDP/TCP-Demo ist im übrigen das Demo3 auf dieser Seite. Aber das hast Du bestimmt schon gemerkt.

@The-Winner
Interessanter Link. Danke.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 17, 2007 23:22 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Tut mir leid, aber bisher bin ich noch nicht auf eine eindeutige Antwort gekommen in auf die TCP/UDP Frage, ob ich mit beiden Protokollen gleichzeitig Daten versenden und empfangen kann, auf dem GLEICHEN Port.

Die Frage ist echt wichtig, will nicht, dass das ganze nacher daran scheitert.

mfg

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 18, 2007 06:24 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
TCP und UDP verhalten sich im wesentlichen wie eigenständige Protokolle, mit eigenen Ports. Ein UDP Port ist also bei gleicher Nummer etwas völlig anderes, als der entsprechende TCP-Port. Die Sache sollte also funktionieren - aber eigentlich kann es doch kein problem sein, die Ports in Konfigurationsdateien seperat definierbar zu machen - bei manchen Firewalls nämlich durchaus sinnvoll.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]