Frage zu Netzwerkprotokoll
-
ceplusplus schrieb:
Wäre es nicht besser am Clienten erst mit dem Attackieren zu beginnen, wenn die erste Antwort vom Server kommt?
Warum? Was erhoffst du dir davon?
krabbels schrieb:
Lags wirst du auch so nicht vermeiden können, im Gegenteil. Deine Variante halte ich sogar für noch gefährlicher, da auf dem Server bereits gekämpft wird während der Spieler gar nichts davon mitbekommt.
Bei Verbindungsstörungen würde der Client mit meiner Variante bereits kämpfen. Bei deiner Variante würde u.U. lediglich auf dem Server gekämpft werden. Der Spieler selber würde also gar nicht merken, dass schon lange gekämpf wird. Außerdem ist mit deiner Variante, durch die Rückbestätigungen, ein höheres Maß an Leistung bei Server und Bandbreite notwenig.
-
ceplusplus schrieb:
Und es macht doch einen Unterschied, ob man 11592 oder 62 sendet?!
MfG
Ich wage einfach mal die Behauptung, dass das nicht interessiert. Ob man jetzt ein Byte oder 2 oder 3 schickt, der Overhead durch UDP und IP ist auf jeden Fall da.
-
@krabbels:
Stimmt sorry, da hatte ich nen Denkfehler.@mad_martin:
Und bei 100.000 Spielern, die gleichzeitig auf einem Server online sind? (Lässt WinSock überhaupt so viele connects zu?)
-
ceplusplus schrieb:
Und es macht doch einen Unterschied, ob man 11592 oder 62 sendet?!
Es macht sicher einen Unterschied, wieviel Daten du am Ende sendest. Nur ist es unrealistisch, dass man zum Speichern der Lebenspunkte mehr als 1 oder 2 Byte braucht und dass Veränderungen in einem wesentlich kleineren Rahmen liegen.
-
Deinen letzten Satz verstehe ich nicht.
Naja jedenfalls wären es wohl immer 2 Byte, egal ob man nun das abzuziehende Leben oder den Lebenstand sendet. Das meintest du wohl?
-
@mad_martin:
Und bei 100.000 Spielern, die gleichzeitig auf einem Server online sind? (Lässt WinSock überhaupt so viele connects zu?)Man müsste wahrscheinlich auf ein anderes System umsteigen, wenn man mehr als 65000 Clienten bedienen müsste!
Ich hab auch schon nachgeschaut und überlegt wie man das Problem lösen könnte! Letztendlich bin ich zu der Erkenntnis gekommen, dass es garnicht zu lösen ist!
Wer Lösungen hat, bitte sofort nennen!
-Mehrere Server laufen lassen!
-
ceplusplus schrieb:
Naja jedenfalls wären es wohl immer 2 Byte, egal ob man nun das abzuziehende Leben oder den Lebenstand sendet. Das meintest du wohl?
Du kannst auch anfangen bei einer maximal möglichen Energie von 200 Punkten(mind. 1 Byte) bei einem Ereignis, was dem Spieler 25 Punkte abzieht nur 5 Bit zu schicken. Mir wäre das zu frickelig. Und ob du da nun wirklich ein Leistungszuwachs rausholst, ist fragwürdig.
-
Jo, schon klar.
Aber ich hätte halt gerne optimalste Optimalität

Also so trafficsparend und sicher wie nur möglich.
-
ich finde schon, dass es sinn macht für den client erst den server zu fragen, ob er einen mob angreifen darf oder nicht.
was wenn z.b. der client versucht einen befreundeten spieler/NPC/mob anzugreifen? der client würde dann einfach drauf loshämmern und die animation abspielen und dann (vielleicht) irgendwann merken dass er es nicht darf, oder auch nicht. ziemlich unsinnig.
bsp:
client -> server: [attack-request] auf mob id 338 server -> client: [attack-reply] accept client -> server: [attack-action] skill id 228 (irgendein skill halt) (animation abspielen für skill id 228) ... client -> server: [attack-request] auf mob id 339 server -> client: [attack-reply] denied (ist ein befreundeter spieler)um vollständige sicherheit zu garantieren müsste der server natürlich so schlau sein, und ein [attack-action] packet auch nur akzeptieren, wenn vorher ein [attack-request] abgeschickt und mit accept beantwortet wurde.
-
Jo stimmt.
Geht aber noch einfacher, attack-action braucht man doch nicht mehr zu senden.client -> server: [attack-request] auf mob id 338 server -> client: [attack-reply] acceptedAccepted am server bedeutet: Berechnung beginnen
Accepted am clienten bedeutet: Animation beginnenclient -> server: [attack-request] auf player id 594 server -> client: [attack-reply] denied...
MfG
-
ceplusplus schrieb:
Jo stimmt.
Geht aber noch einfacher, attack-action braucht man doch nicht mehr zu senden.client -> server: [attack-request] auf mob id 338 server -> client: [attack-reply] acceptedAccepted am server bedeutet: Berechnung beginnen
Accepted am clienten bedeutet: Animation beginnenclient -> server: [attack-request] auf player id 594 server -> client: [attack-reply] denied...
MfG
Hatte ich mir auch überlegt.
Das hätte aber den Nachteil, dass du nach jedem Angriff neu serverseitig prüfst, ob der Mob angegriffen werden kann.
Ich dachte es mir also so, dass die [attack-action]-Packete nicht mit accept beantwortet werden müssen um Overhead zu vermeiden, sondern nur einmalig mittels des [attack-request]-Packets geprüft wird, ob man den Mob angreifen darf.Bsp:
client -> server: [attack-request] auf mob id 338 server -> client: [attack-reply] accept client -> server: [attack-action] skill id 228 (irgendein skill halt) (animation abspielen für skill id 228) client -> server: [attack-action] skill id 228 (irgendein skill halt) (animation abspielen für skill id 228) client -> server: [attack-action] skill id 228 (irgendein skill halt) (animation abspielen für skill id 228) ...Wahrscheinlich ist deine Variante aber doch sicherer/besserer.
Soll auch vorkommen, dass Mobs die Seiten wechseln, außer Reichweite geraten oder Ähnliches - also lieber jedesmal neu auf Bestätigung warten.
-
Eigentlich meinte ich, dass attack-request nur einmalig gesendet wird...
client -> server: [attack-request] auf mob id 338 server -> client: [attack-reply] acceptedSomit beginnt der Server mit dem berechnen und am Client findet die Animation statt.
Die einzigen Pakete, die während der Attacke gesendet werden, sind Aktualisierungs-Pakete vom Server zum Clienten wie neuer Lebenstand, ob die Attacke getroffen hat usw...
Is ja egal ob der Gegner wegrennt, vor jeder Attacke wird ja eine Bereichsprüfung durchgeführt, ob der Spieler in Reichweite des Mobs ist.
MfG
-
Pyr0kar schrieb:
was wenn z.b. der client versucht einen befreundeten spieler/NPC/mob anzugreifen? der client würde dann einfach drauf loshämmern und die animation abspielen und dann (vielleicht) irgendwann merken dass er es nicht darf, oder auch nicht. ziemlich unsinnig.
Blödsinn. Der Client weiß doch selber, dass das ein befreundeter Spieler/NPC/Mob ist und wird daher einen Angriff verweigern.
-
Thomy schrieb:
@mad_martin:
Und bei 100.000 Spielern, die gleichzeitig auf einem Server online sind? (Lässt WinSock überhaupt so viele connects zu?)Man müsste wahrscheinlich auf ein anderes System umsteigen, wenn man mehr als 65000 Clienten bedienen müsste!
Ich hab auch schon nachgeschaut und überlegt wie man das Problem lösen könnte! Letztendlich bin ich zu der Erkenntnis gekommen, dass es garnicht zu lösen ist!Es bedarf keiner Lösung wo kein Problem ist.
Das 64k Limit ist soweit ich das beurteilen kann eine "Urban Legend".
Eine TCP Verbindung wird festgelegt durch Source IP, Source Port, Destination IP und Destination Port.
Destination IP und Port sind dabei festgelegt (durch den Server), aber Source IP und Source Port sind es nicht.
Serverseitig wird bei einer TCP Verbindung kein Port "verbraucht" (Wobei der Server hier einfach derjenige PC ist welcher listen/accept macht, der Client derjenige der connect macht.)
Serverseitig wird nur ein Socket verbraucht, und nirgends steht geschrieben dass es nur 64k SOCKETs geben kann (ein SOCKET ist normalerweise ein "int" Handle, d.h. meist 32 Bit breit - da kann es wesentlich mehr als 64k davon geben).Und mit UDP exisitert das Problem sowieso nicht.
Davon abgesehen ist UDP für Server mit massiv vielen gleichzeitigen "Connections" sowieso die bessere Wahl (bzw. sagen wir einfach mal "Clients" statt "Connections", da UDP keine Connections kennt), da man bei UDP viel besser die Kontrolle hat wieviel Resourcen pro Client verbraucht werden. Man muss z.B. das "Demultiplexing" selbst machen, was es aber eben ermöglicht genau zu kontrollieren wie gross die verwendeten Puffer sind etc.
Wer Lösungen hat, bitte sofort nennen!

-Mehrere Server laufen lassen!
Reicht dir das als "Lösung" (für das IMO nicht vorhandene Problem)?
-
krabbels schrieb:
Pyr0kar schrieb:
was wenn z.b. der client versucht einen befreundeten spieler/NPC/mob anzugreifen? der client würde dann einfach drauf loshämmern und die animation abspielen und dann (vielleicht) irgendwann merken dass er es nicht darf, oder auch nicht. ziemlich unsinnig.
Blödsinn. Der Client weiß doch selber, dass das ein befreundeter Spieler/NPC/Mob ist und wird daher einen Angriff verweigern.
Blödsinn. Wenn du die Clientseite entscheiden lässt, welche Spieler angegriffen werden können, ist dein Spiel ziemlich unsicher.
Da lässt du Memory-Editoren, selbstgebaute Clients, Hexeditoren, Cheattools usw. freien Lauf.
Nur als reales Bespiel, in "Kalonline" kann man mit Hilfe eines einfachen Tricks mit einem Memory-Editor die Reichweite der Angriff bis ins Unendliche erhöhen und die Spielergeschwindigkeit ebenso, und der Server spielt dort einfach mit ohne Nachzuprüfen, wie weit du nun von deinem Ziel entfernt bist.
Dazu brauchst du nichtmal eine Programmiersprache zu können, sondern nur ein Tool haben und ein paar Werte umstellen indem du Knöpfchen drückst

Solche Spiele sind es dann, die Anti-Hackingtools und solch einen Kram einbauen um die Sicherheit zu erhöhen, weil sie alles clientseitig haben.
Soviel also zu "der client weiß doch selbst".
-
Reicht dir das als "Lösung" (für das IMO nicht vorhandene Problem)?
THX, bin bisher immer davon ausgegange, dass jede Connection einen Port verbraucht! Dass es aber mehr als 2^16 Ports gibt, bezweifele ich trotzdem!
Man sieht doch praktisch überall nur Einstellungen und co., die von "0"-65535 gehen!---
Klaro mit UDP hat man das Problem nicht :p !
Gruß
tHOMY
-
hustbaer schrieb:
Das 64k Limit ist soweit ich das beurteilen kann eine "Urban Legend".
es ist also dein glauben vs die legend, spannender fight ;).
da ich das vor ewigkeiten auch mal wissen wollte, hab ich natuerlich nachgesehen. windows95 hatte 255sockets als limit, winNT hatte 65535.
Wie das zZ ist sollte man einfach irgendwo raussuchen statt das hier jeder was anderes postet

-
Pyr0kar schrieb:
Blödsinn. Wenn du die Clientseite entscheiden lässt, welche Spieler angegriffen werden können, ist dein Spiel ziemlich unsicher.
grml

Wenn der Client die Information, dass xyz ein NPC ist, anders interpretieren würde, würde das Spiel auf ihm nicht mehr synchron mit dem Server laufen. Du kannst daraus keinen Hack schlagen. Du kannst ja sinnloserweise gerne eine Nachricht "Möchte attackieren" absenden, aber auf dem Client auch noch die Kampf Animation/Musik etc. beim Angriff eines NPCs abzuspielen, wäre vermutlich nicht wirklich im Interesse des Spiels.
-
krabbels schrieb:
Pyr0kar schrieb:
Blödsinn. Wenn du die Clientseite entscheiden lässt, welche Spieler angegriffen werden können, ist dein Spiel ziemlich unsicher.
grml

Wenn der Client die Information, dass xyz ein NPC ist, anders interpretieren würde, würde das Spiel auf ihm nicht mehr synchron mit dem Server laufen. Du kannst daraus keinen Hack schlagen. Du kannst ja sinnloser weise gerne eine Nachricht "Möchte attackieren" absenden, aber auf dem Client auch noch die Kampf Animation/Musik etc. beim Angriff eines NPCs abzuspielen, wäre vermutlich nicht wirklich im Interesse des Spiels.Hast du dir überhaupt mal mein Beispiel angeschaut?
In "kalonline" _kann_ man in der Tat sehr gut einen Hack daraus schlagen, dass nicht serverseitig überprüft wird ob der Angriff stattfinden darf.
Du kannst vom einen Ende der gesamten Map ein anderes Monster auf dem anderen Ende angreifen, wenn du es selektiert hast.
Du kannst das Vieh damit sogar töten, geht alles wunderbar.Und das nur, weil der Client einfach "greife NPC ... an" sendet und der server so blöd ist, und es einfach tut und die HP abzieht.
Der Server sollte die anfrage prüfen (auf Reichweite, Befreundete Spieler usw.) und seine Antwort dem Client schicken, damit dieser weiß, ob er die Animation abzuspielen hat oder nicht, ist nämlich ziemlich blöd wenn der Client die Angriffsanimation abspielt und der Mob keine HP verliert.
Wenn du Hacks vermeiden willst kommst du um eine serverseitige Überprüfung nicht drum herum.
Den Client zu cheaten/bearbeiten ist immer möglich, ob das nun schwer oder leicht gemacht wird ist eine andere sache, bei kalonline wird es leicht gemacht.
Den Server zu cheaten/bearbeiten wird ziemlich schwer ohne physikalischen Zugang.
Wenn der Client die Information, dass xyz ein NPC ist, anders interpretieren würde, würde das Spiel auf ihm nicht mehr synchron mit dem Server laufen. Du kannst daraus keinen Hack schlagen.
Ein Memory-Editor sorgt eigentlich ganz schnell dafür, dass der _Client_ denkt, es sei ein nicht-befreundeter. Da lässt sich super ein Hack draus schlagen.
Mit der Reichweite dauert das z.b. bei einigen Onlinespielen nur wenige Sekunden mit dem richtigen Programm die Speicherstellen zu bearbeiten und es funktioniert super.
Ein gutes Spiel würde sich selbst nicht cheaten lassen, wenn du den Source von deinem Client freigibst. Du musst immer damit rechnen dass jemand den Client umbiegt, der Server muss damit klar kommen und darf nicht falsch handeln.
Alles andere is Security through obscurity (siehe http://de.wikipedia.org/wiki/Security_through_obscurity)
-
Pyr0kar schrieb:
In "kalonline" _kann_ man in der Tat sehr gut einen Hack daraus schlagen, dass nicht serverseitig überprüft wird ob der Angriff stattfinden darf.
Du schickst an den Server die Nachricht "Möchte attackieren" also wird es doch serverseitig überprüft. Niemand spricht davon, dass es nicht so sein sollte. Der Client braucht nun aber keine Rückbestätigung mehr. Der Client kann Ereignisse gerne anders interpretieren; Er kann aus NPCs Blumen machen, aus Häusern Bäume und Schwertern Atombomben. Das tatsächliche Spiel findet aber auf dem Server statt, wo Schwerter eben keine Atombomben sind.
Pyr0kar schrieb:
Der Server sollte die anfrage prüfen (auf Reichweite, Befreundete Spieler usw.)
Richtig. Und anschließend das tatsächliche Spiel aktualisieren.
Pyr0kar schrieb:
und seine Antwort dem Client schicken, damit dieser weiß, ob er die Animation abzuspielen hat oder nicht, ist nämlich ziemlich blöd wenn der Client die Angriffsanimation abspielt und der Mob keine HP verliert.
Nein. Der Client weiß selber, dass er da einen NPC angreifen will also braucht er gar keine Animation zu starten, da er die Antwort vom Server bereits kennt.
Pyr0kar schrieb:
Ein Memory-Editor sorgt eigentlich ganz schnell dafür, dass der _Client_ denkt, es sei ein nicht-befreundeter. Da lässt sich super ein Hack draus schlagen.
Wenn der Client durch einen Hack NPCs für angreifbar oder Schwerter für Atombomben hält, kann er das gerne machen. Der Server wird die Zusammenarbeit aber verweigern. Die beiden Spiele laufen nicht mehr synchron.
Verstehst du es nun?