AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

geeignetes Protokoll

Ein Thema von RedShakal · begonnen am 23. Jun 2009 · letzter Beitrag vom 23. Jun 2009
Antwort Antwort
RedShakal
(Gast)

n/a Beiträge
 
#1

geeignetes Protokoll

  Alt 23. Jun 2009, 18:09
Hallo zusammen,

Ich habe nach langem hin und her mal wieder eine Frage.


Zuerst schildere ich das Problem:

1 Server
1-8 Clients


Der Client connectet zum Server
=> Der Server empfängt den connected befehl und sendet dem Client eine ID zu
=> der Client empfängt die ID und übernimmt sie
=> Client sendet Nicknamen aus Editfenster zusammen mit der erhaltenen ID zum Server
=> Server empfängt und übernimmt ihn in ein Label
=> Verbindung steht.
=> Server nimmt Einstellungen vor und übermittelt sie per Knopfdruck zu allen Clients
=> Clients empfangen die Daten und übernehmen sie entsprechend
=> Wenn Client offline geht sendet er einen Befehl zusammen mit seiner ID zum Server
=> Der Server ordnet durch die ID den Client zu und deaktiviert das entsprechende Label.

Soweit die Theorie.

Wozu das ganze?

Es geht um einen GameHack. Der Server gibt die Werte vor, sendet sie zu allen Clients, die -sofern das Spiel läuft- die Daten entsprechend in den Arbeitsspeicher schreibt.

Keine angst, es handelt sich hierbei um erwünschtes Cheaten. Es geht um ein 12 jahre altes Spiel, welches über keine Online Funktion verfügt und nur von einer kleinen Gruppe noch über Hamachi gespielt wird. Durch den Hack, ist man in der Lage, werte im Spiel zu ändern an die man sonst nicht heran kommt. Bsp. das Startgeld oder das Einheitenlimit / Gebäudelimit. Durch das Client / Server prinzip schickt der Server an alle die Daten, dadurch hat jeder die gleichen Werte im Speicher.

Bis jetzt habe ich das ganze so gelöst:

TServerSocket und TClientSocket => Die Daten werden mittels Socket.SendText('123@321'); gesendet.
Wenn der Client das empfängt, filtert er das alles vor und nach dem @ heraus und schreibt die beiden gefilterten Zahlen entsprechend in den Speicher.

Wo ist das Problem?

Bis jetzt funktioniert alles soweit, allerdings musste ich feststelle, als ich 3 Werte übermitteln wollte, klappte die Filter funktion nichtmehr korrekt.

Da ich selbst das Protokoll für höhst uneffektiv halte, suche ich eine bessere alternative. Ich stehe immer wieder vor dem Problem das bei mehreren Strings, das ganze schief geht.

Es werden nicht viele Daten übermittelt. Bei Connecten => Nickname + ID und bei Datenübermittlung 2-5 Werte => Bei disconnect eine abmeldebestätigung.

Jetzt suche ich eine Lösung:

Bereits versucht habe ich folgendes

Sockets => uneffektiv
TCP => Server kann nicht senden ( zwingend erforderlich )
UDP => ungeeignet, da Paket um jeden Preis ankommen muss


Ich erhoffe mir eine Idee wie man das ganze besser lösen könnte ohne Seitenweise Quellcode zu schreiben. Vielleicht gibt es irgentwo ein einfach zu bedienendes Protokoll mitdem ich die Problematik ohne viel Traffic lösen kann.

Ggf. möchte ich im späteren Verlauf einen Dx5 Overlay schreiben, der bestimmte Werte als Text im Spiel selbst anzeigt. Oder einfach als Ingame Chat, wenn mal der TS2 nicht richtig funktioniert.


Bin für Vorschläge, Beispiele und Anleitung offen.

PS. Wen interessiert um welches Spiel es sich handelt => Krush Kill 'n' Destroy 2 von Melbourne House.


Grüße Patrick
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: geeignetes Protokoll

  Alt 23. Jun 2009, 18:16
Hallo,

könnte ich mir so vorstellen:

1. Länge des Gesamtpackets
2. Anzahl an Elementen
3. Element ID
4. ElementLänge
5. ElementData
6. Element ID
7. ElementLänge
8. ElementData

wenn man das Packet noch auf Fehler testen möchten
könnte man noch einen CRC Code in das Packet einfügen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: geeignetes Protokoll

  Alt 23. Jun 2009, 18:16
Vielleicht hilft dir dieses Tutorial ein wenig:
http://www.delphi-library.de/topic_66706.html
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
RedShakal
(Gast)

n/a Beiträge
 
#4

Re: geeignetes Protokoll

  Alt 23. Jun 2009, 18:30
Ich habe es bereits mit dem Binär Protokoll probiert, aber ehrlich gesagt sieht das recht kompliziert aus. Und die ganze Ansi String geschichte macht das ganze leider auch nicht wirklich leichter.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#5

Re: geeignetes Protokoll

  Alt 23. Jun 2009, 19:14
Zu Packet-Format wurde ja schon was gesagt
und du kommst besser, wenn du es nicht direkt mit der GUI koppelst ... also nicht in ein Label rein.
So kann man die GUI später auch mal ändern und das Innere funktioniert dennoch.

Erstell dir z.B. eine Klasse, welche alles verwaltet.
Womöglich auch für jeden Client Eine und noch eine Masterklasse für den Server,
so könnte man auch leicht mal noch ein paar mehr Clients nachrüsten.

Dann fragt die GUI nur noch bei der Klasse nach dem aktuellen Status, bzw. bei Statusänderung wird eine Callback-Funktion der GUI kontaktiert.


Statt AnsiString kannst du ja auch gleich WideString nehmen, obwohl sich wärend des Transfers UTF-8 gut eignet (ist kleiner).
Und es wäre auch gleich für andere Sprachen gewappnet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: geeignetes Protokoll

  Alt 23. Jun 2009, 19:39
Zitat von RedShakal:
TCP => Server kann nicht senden ( zwingend erforderlich )
Es wundert mich, dass du TCP so schnell verworfen hast - wenn ich mich richtig erinnere, kann der Server auch senden. Dafür braucht man den TIdPeerThread den man im OnConnect übergeben bekommt.

Vor Ewigkeiten hab ich auch mal eine kleine Klasse geschrieben, die eine Broadcast-Funktion bereitstellt: http://www.delphipraxis.net/internal...ct.php?t=34754 (Bitte nicht deswegen schlagen ^^)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz