Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 04.11.09 10:31 
Hi,

ich nutze für ein Multiplayer-Spiel user profile iconNarses' NBFP-Komponenten.

Dabei benötige ich eine Art Handshake, um sicherzustellen dass Client und Server wirklich die gleiche Protokollversion sprechen. user profile iconNarses selbst hat sowas im Tutorial zwar rudimentär drin, aber das funktioniert eben nur wenn beide Seiten wirklich wissen was sie tun.

Momentan handhabe ich das so, dass ich Statemachine-Artig nach dem Verbindungsaufbau 2 Sekunden Zeit lasse, in denen bestimmte Pakete ausgetauscht werden müssen. Das ist nur weder sonderlich schön, noch wiederverwendbar (für die reine Server-Statusabfrage steht der gleiche Code nochmal da...). Dass es dann Probleme gibt falls einer der Peers erst noch eine Firewall-Regel anlegen will und das Aufbauen der Verbindung deswegen länger dauert, dürfte klar sein.

Wie macht man sowas "richtig"? Ich will dem User ja auch eine "meaningful error message" geben können, also einfach so Verbindung zu machen ist auch doof.

Dass da ein NBFP-Protokoll ist wird ja vom Protokolladapter schon verifiziert, aber das schließt ja nicht aus dass Client und Server ganz andere Spiele sind.

Ideen werden immer gern genommen...

Sebastian

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 05.11.09 11:19 
hmmm, Mach nen Zero Knowledge Proof auf die Versionsnummer. SMP wäre da ne Idee :mrgreen:

Spaß beiseite. Bilde einen Hash über alle relevanten Dateien, bzw. übertrage die Versionsnummer beider. Die jeweilige Gegenseite kann dann mit einem ACK die Verbindung entweder bestätigen oder mit einem NACK ablehnen. Das ganze so lange wiederholen, bis keiner von beiden mehr eine andere Protokoll-Version anbieten kann. Dabei fangen beide Clients jeweils mit der höchsten unterstützen Version an.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 05.11.09 12:12 
Das ist schon klar. Ich lasse eh nur genau eine Versionspaarung zu, nämlich die wo beide genau die gleiche haben.
Momentan läuft da ein doppeltes Challenge-Response.
Irgendwo hatte ich das rein kommentiert... ah, hier.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
// what happens on connect?
// Client sends AppID+Version
//   if ok, Server responds with AppID+Version
//     Client may commence communication or close connection
//   if not, Server responds with Error+Version

Das Funktioniert auch, prinzipbedingt sehen statemachines mit TNBFP aber immer etwas seltsam aus.
Gleichzeitig lässt sich das recht schlecht modularisieren.

Protokolle sind hier nicht so mein Problem, tatsächlich eher die Implementierung.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."