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

Aktuelle Zeit: Do Jul 10, 2025 01:21

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: TCP in meinem Fall... wie am besten?
BeitragVerfasst: Di Feb 17, 2009 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo.

Ich habe früher mal mit TCP etwas gemacht, aber das ist ja schon lang her, seit dem kaum noch überhaupt programmiert.
Nun meine folgende Frage:

Wie übergebe ich am besten die Daten?

- In Texten jede Aktion einzeln rüber schicken?
Also vom Prinzip her Befehle versenden... "Objekt1 set position 4/3/5"

- Oder immer komplett alle daten übermitteln? (also alle spielerdaten)
Da kann man doch Records übermitteln? (wenn ja, in welchem abständen am besten?)

Ich Benutze, oder will ScktComp benutzen.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 18, 2009 16:21 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich hab mich auch erst vor kurzem mit Datenübertragung übers Netzwerk für mein aktuelles Projekt herumschlagen müssen.

Also als Text ist das vllt nicht so optimal, da die Daten dann ja mehr Speicher benötigen, besser wäre es dann wohl das ganze als Binärdaten zu übertragen.
Und zu bei dem "komplett oder einzeln", kommt es wohl darauf an wie groß der Datensatz ist. Weil bei TCP noch andere Daten als die Nutzdaten übertragen werden (Header), kann es sein das zB 2 mal 1/3 des gesamten Datensatzes mehr als 1 mal 3/3 wird. Dann lohnt sich das einzeln verschicken natürlich nicht.

Dann zu den Zeitabständen: So selten wie möglich, sollte man denke ich anpeilen, da man dann wohl eher davon ausgehen kann, das auch bei niedrigeren Übertragungsraten kein Stau entsteht. Wie oft man die Daten dann wirklich übertragen muss, hängt von der Qualität der Interpolation/Extrapolation und der Art des Programms ab. Wenn es eine Art Shooter ist, muss man wohl relativ häufig Daten übertragen, bei Strategiespielen eher weniger, oder es ist etwas ganz anderes, kA. Mehr als 50mal in der Sekunde ist denke ich bei beiden nicht nötig, was aber jetzt nur so eine Schätzung ist.

Außerdem solltest du dich vielleicht auch mal in Richtung UDP umschauen, weil da die Daten schneller übertragen werden, da ein paar Sachen eingespart werden. Weiß jetzt nicht ob das komplett keinen Header hat, aber sicher ist das die Nutzdaten einen größeren Anteil in jedem Paket haben. Der Nachteil ist dabei allerdings das es fehleranfällig ist. Das heißt das Pakete verloren gehen können oder vielleicht auch Fehler enthalten. Damit kann man entweder Leben, wenn die Daten sowieso schnell überschrieben werden, oder man muss selbst für Fehlerkorrektur sorgen. Ach, außerdem kann es sein das die Pakete in einer anderen Reihenfolge ankommen, also muss man so ein bischen Fehlerkorrektur wohl immer betreiben. Bei mir zumindest hat es sich gelohnt und der Unterschied war deutlich sichtbar (im LAN). Bei den meisten Spielen wird es wohl so gemacht dass UDP für die Daten während des Spielens benutzt wird und TCP zum Beispiel für Authentifizierung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 18, 2009 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wenn man UDP in einem Shooter (o.ä.) benutzt geht man meist so vor:
1. Man sendet jedesmal sämtliche Daten. Also keine relativen Positionsdaten oder ähnliches => absolute Daten
2. Man sendet immer eine Packet-ID mit, die einfach mit jedem Paket inkrementiert wird.

Geht ein Paket verloren ist dies kein Problem, da man mit dem nächsten Paket wieder die vollständigen korrekten Daten erhält. Kommen die Pakete in der falschen Reihenfolge an, ist auch dies kein Problem. Anhand der Packet-ID kann man ältere Pakete leicht erkennen und ignorieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 18, 2009 21:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Aha, danke schonmal an euch 2.... wo kann ich mir über dieses UDP informieren :-/
Kennt ihr Tutorials?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich hab hier gerade das hier auf meiner Platte gefunden, ich weiß aber nicht ob das was taugt:
http://www.gamasutra.com/features/19970 ... son_01.htm
(mit UDP hat das glaub ich auch nix zu tun...)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 11:35 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Ich hab mich auch mal damit beschäftigt und habe festgestellt, dass es vor allem 2 wichtige Unterschiede zwischen TCP und UDP gibt:
1. Verlust
TCP: Alle Pakete kommen immer komplett und in der richtigen Reihenfolge an
UDP: Wie oben schon erwähnt, ist UDP fehleranfällig

2. Broadcasts
Soweit ich das Thema verstanden habe (sollte ich mich irren, alles weitere schnell wieder vergessen :wink:), unterstützt nur UDP broadcast Meldungen, was für Spiele sehr wichtig sein kann, bzw. ist. Broadcast Nachrichten werden nicht nur an einen Rechner geschickt, sondern jeder, der auf dem entsprechenden Port "zuhört" kann sie lesen. Bei TCP geht das glaube ich nicht, da gibt es immer nur 1-zu-1 Verbindungen. Bei Spielen wo viele Spieler mitspielen können und nicht nur 2 ist also UDP sinnvoller, allerdings muss man dann auch (wie schon gesagt) auf Fehler achten


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 14:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 15:18
Beiträge: 62
glmatt hat geschrieben:
2. Broadcasts
Soweit ich das Thema verstanden habe (sollte ich mich irren, alles weitere schnell wieder vergessen :wink:), unterstützt nur UDP broadcast Meldungen, was für Spiele sehr wichtig sein kann, bzw. ist. Broadcast Nachrichten werden nicht nur an einen Rechner geschickt, sondern jeder, der auf dem entsprechenden Port "zuhört" kann sie lesen. Bei TCP geht das glaube ich nicht, da gibt es immer nur 1-zu-1 Verbindungen. Bei Spielen wo viele Spieler mitspielen können und nicht nur 2 ist also UDP sinnvoller, allerdings muss man dann auch (wie schon gesagt) auf Fehler achten

Ja, das kann gut sein. Ich habe bis jetzt noch nicht mit UDP gearbeitet, aber mit TCP kriegst du sowas (zumindest mit den Mitteln, die mir bisher zur Verfügung standen) nicht hin. Dort gibt es immer einen Server, der jeden Client einzeln bedient, und dann ggf. natürlich auch Pakete mehrfach verschickt. Das ist etwas Zeitaufwändiger - und eben Performance ist ja der Vorteil von UDP.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Naja, UDP-Broadcasts sind nicht wirklich so sinnvoll, denn sie funktionieren selbstverständlich nur im LAN. Wenn du im Internet spielen willst, werden diese
Broadcasts nicht funktionieren. Das einzige, wofür ich UDP-Broadcasts nutze, ist für das suchen von Servern im LAN. Ansonsten läuft es so ab, wie Yogu gesagt hat.

Ich würde mir überlegen, welche Daten bei dem Spiel übertragen werden müssen. Bei meinem (Tuxbomber) sind das nur sehr wenige, ein paar Byte pro Ereignis und Benutzereingabe. Dabei kommt es nicht wirklich auf Geschwindigkeit an, deswegen hab ich mich für TCP entschieden, denn da kommt auch alles wirklich an. Wenn du allerdings ein Spiel hast, wo sehr viel übertragen wird, solltest du auf UDP setzen (fürs Internet halt ohne Broadcasts).

Was die Art der Übertragung angeht: Ein kleines Protokoll, welches einzelne Befehle und deren Argumente kapselt und verschickt ist da wohl angebracht. Hier findest du ein ausführliches Tutorial, wie man soetwas angehen kann. Wenn einem das noch nicht genug ist kann man die ganzen Daten auch noch in binärer Form übertragen (gibts dort auch ein Tutorial für). Damit kann man dann auch Dateien o.Ä. verschicken.

Markus

Edit: Falls mein Beitrag irgendwie den Eindruck erweckt, dass UDP nur broadcasten kann, so war das natürlich nicht beabsichtigt. Wäre ja auch ziemlich blöd, wenn man nicht auch an einzelne Adressen senden könnte.


Zuletzt geändert von Markus am Fr Feb 20, 2009 20:07, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
UDP kann auch an eine bestimmte IP senden. Es geht nicht nur Broadcast, aber es geht (im gegensatz zu TCP, wie hier schon richtig bemerkt wurde) auch Broadcast. Für Serversuche im LAN in der Tat sehr hilfreich.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Huhu... Hab jetzt ein Problem...

Ich habe ja die Sockets nicht installiert und das geht anscheind auch nicht bei PE versionen.
Also wie bekomm ich das hin, dass die events auch aufgerufen werden wenn etwas empfangen wird oder so?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 21, 2009 19:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Mein Delphi 6 PE hat noch die TCPServerSocket und TCPClientSocket-Komponenten... Ansonsten, kannst du dir die Indys anschauen - wobei die wirklich komplex sind und man da auch nicht einfach ein Event bekommt, soweit ich das bisher rausbekommen habe.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 10:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Moin,

du kannst sie entweder nachinstallieren oder einfach so verwenden.
Die Events musst du dann einfach selbst definieren:

Code:
  1.  
  2. socket.OnClientConnect:= MeinEigenesEvent;
  3.  


"MeinEigenesEvent" ist dann einfach eine Methode, die vom Typ des Events ist (also gleiche Parameter).

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ja mit dem Nachinstallieren, hat er geschrieben gehabt nicht bei PE Versionen, weil es nicht legal ist oder sowas ...

Aber das mit dem definieren ist gut ja :-) Danke

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 23, 2009 20:23 
Offline
DGL Member

Registriert: Mi Nov 12, 2008 18:27
Beiträge: 134
also soweit ich weis sind die "alten" socketkomponenten bei delphi 7+ deaktiviert worden, weil sie instabil sind, d.h. wenn du große dateien (über sendstream) verschickst gibts probleme - ansonsten sind mir keine bekannt und ich benutze sie auch lieber als die tcp sockets.... naja, aber wenn du noch nen bisschen was an der performance schrauben willst, dann kannst du dich ja mal in die winsockets mit api reinarbeiten - das ist das selbe nur "entkapselt" - sprich du musst dir alle methoden noch selbst schreiben, kannst dafür aber halt auch alles selbst schreiben :lol:

persönlich bin ich kein großer freund von udp, weil es wie schon gesagt, unsicher ist. möglicherweise macht es auch sinn, wenn du mehrere verbindungen öffnest - dann kannst du mit der einen die steuerung deines datenstroms vornehmen. macht aber nur sinn, wenn du auch wirklich viele daten haben solltest.

mfg grey


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 26, 2009 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Also, ich benutze in meinem Fall tcp, weil es nicht viele Daten sind ...

Folgendes Problem gleich zu anfangs :-/ Laut Tutorial sollte das funktionieren?

Code:
  1.     function TGameControl_Server.CreateGame():boolean;
  2.     begin
  3.       ServerSocket := TServerSocket.Create(GLForm);
  4.       ServerSocket.OnClientConnect := ClientConnect;
  5.       ServerSocket.Port := PORT;
  6.       ServerSocket.Open;
  7.     end;


Hab das result noch nicht deklariert, aber das ist ja eine andere sache ;-)

Beim ausführen dieser Funktion, bekomm ich eine Fehlermeldung, er stoppt beim ausführen des Creates von TServerSocket.
die GLForm ist schon erstellt und angezeigt zu dem moment. Es wird beim Create AOwner: TComponent erwartet.... :-/

HILFE?! ;-)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] 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.010s | 17 Queries | GZIP : On ]