Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

killmichnich

unregistriert

1

10.09.2009, 20:28

Updater für Spiel

Hiho,
da ich zur Zeit an einem Spiel arbeite und es schon so weit ist, dass man es halbwegs spielen kann, schick ich das regelmäßig an ein paar Freunde zum Testen. Weil ichs jetzt aber echt doof find das ganze ständig so zu verschicken, hab ich mir überlegt, dass ich ne "Updater.exe" erstell, die mir die Dateien dann selber von meinem Server runterlädt, wenns was neues gibt.
Jetzt bin ich nur bei der Frage hängen geblieben, wie ich das am Besten hinkrieg und such jetzt hier kreative Ideen, wie ihr denn sowas realisieren würdet bzw. bei manchen Sachen schon verwendet habt ^^

Würde mich über Vorschläge freuen =)

MfG Killmichnich

2

10.09.2009, 20:31

Mach dir das Leben einfach und nimm RakNet.
Dort gibt es eine Updatefunktion, bzw. es gibt mehrere.

Bei der einfachsten Variante wird der Client mit einem Verzeichnis auf dem Server abgeglichen.

3

10.09.2009, 21:45

Mach das aber auf jeden Fall optional und auf Nachfrage, ich hasse es, wenn Programme Dinge ungefragt tun, die ich evtl. nicht möchte.
Ansonsten kann man natürlich auch sowas wie SVN benutzen, oder in kleineren Kreisen DropBox, oder die Dateien per http laden, das sollte auch nicht sehr schwer sein.
Lieber dumm fragen, als dumm bleiben!

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

10.09.2009, 21:52

Ich mach das nach folgendem (sehr einfachen) System:

Die MD5 (oder SHA1 oder ...) Summen der Dateien der Ursprungsversion werden gespeichert. Bei jeder nachfolgenden Version werden dann die aktuellen Prüfsummen mit denen der Ursprungsversion verglichen und alle veränderten Dateien in ein Zip Archiv gepackt.

Dieses Ziparchiv wird dann hochgeladen und kann einfach "über" die alte Version entpackt werden um sie zu aktualisieren. Das klappt natürlich nur gut, wenn die einzelnen Dateien eher klein sind. Bei größeren einzelnen Dateien sollte man zu binären diffs greifen. Aber auch dafür gibts massig Bibliotheken und Algorithmen.

goldfisch007

Alter Hase

Beiträge: 446

Wohnort: Süden von Berlin

  • Private Nachricht senden

5

10.09.2009, 22:04

ich weis nicht ob du das buch von david hast
aba hinten isn nen kapitel über plugins via .dlls

dabei wird eine methode beschrieben wie die win-API nen ordner durchgehenkann (eine datei nach der anderen) und wenn du diese funktion jetzt über deine update exe aufrufst und nen verzeichnis auf nem server anch dateien durchsuchst und die dann runterlädst denke ich das müsste funzen

was ich sage denke ich mir. ich habe diese funktion noch nie benutzt und weis nicht ob sie für diesen zweck geeignet ist

diese Funktion heißt:

Quellcode

1
FindFirstFile

findet das erste file/datei und mit

Quellcode

1
 FindNextFile
das nächste[/quote]
Wir bauen auf und reißen nieder, so ham wir Arbeit ima wieder...
--------------------
http://www.piratenpartei.de/tmp/images/Slogans_5_0.png
--------------------
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender, geklaut von Helmut xD)

killmichnich

unregistriert

6

11.09.2009, 11:01

ok also das ganze hört sich hier doch schonmal ganz gut an, danke =)

Dass das ganze optional sein soll hab ich mir auch überlegt, werd halt iwie ne abfrage einbauen obs was neues gibt und dann den Benutzer fragen ob ers runterladen will.

Mein größeres Problem is jetzt weniger das "sammeln" der neuen Dateien die verschickt werden sondern viel mehr, wie ich die am besten verschick ... und das würd ich ja am liebsten selber in mein Programm schreiben ... deshalb werd ich mir wohl das RakNet anschaun =)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

11.09.2009, 11:27

Leg auf deinem Server eine Datei "version.txt" an, in der du die aktuelle Version des Spiels speicherst. Zum Beispiel "1512". Zu Beginn lädt dein Spiel nun diese Datei vom Server, liest die Versionsnummer und vergleicht sie mit seiner eigenen Nummer. Wenn die Nummer auf dem Server größer ist, kommt eine Meldung "Möchten Sie updaten?". Wenn ja, lädst du die aktuelle Version vom Server (Setup-EXE oder Zip-Datei) und startest/entpackst sie. Das Runterladen von Dateien geht mit den WinInet-Funktionen.

killmichnich

unregistriert

8

11.09.2009, 14:25

ah gut danke das hört sich gut an =)

killmichnich

unregistriert

9

12.09.2009, 15:49

also ich hab das ganze jetzt mal so gemacht:
Ich lad mir ne datei runter und überprüf die version wie ihr gesagt habt, wenn die versionen nich übereinstimmen frag ich ob man die updates runterladen will. Wenn ja lad ich mir die zip datei runter und les mir daraus ne datei raus in der steht welche dateien in der zip sind und wo die hin sollen, die Datei heißt updates.txt.
So weit klappt das auch ganz gut, nur dann hab ich ein Problem:
In der 1. Zeile von updates.txt steht der Dateiname
In der 2. Zeile von updates.txt steht das Ziel
In der 2. der datei name .. usw.

Das les ich dann eben aus und versuch die Dateien anhand des Namens auszulesen, den ich aus der 1. Zeile krieg. Nur das ganze funktioniert nicht, ich weiß nich genau worans liegt, aber ich "vermute", dass es daran liegen könnte dass evtll. noch leerzeichen hinter den namen der dateien stehen.
Ich kann jetzt ja mal den code zum auslesen der datei posten und ihr könnt mir helfen den fehler zu finden ^^

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
ifstream f;
f.open("updates.txt", ios::in | ios::binary);
while(!f.eof())
{
   char datei[128];  //der name der datei

   char ziel[128];  //wo die datei gespeichert werden soll

   ZeroMemory(&datei, sizeof(datei));
   ZeroMemory(&ziel, sizeof(ziel));
   f.getline(datei, sizeof(datei));
   f.getline(ziel, sizeof(ziel));

   int result = readArchivedFile("updates.zip", datei, "", &p_text, &textSize);
...
}

Wenn ich das so mach liefert mir die Funktion readArchivedFile() -2 zurück, was soviel ich weiß heißt, dass die Datei nicht gefunden wurde.
Wenn ich mir den Namen der Datei (also datei) so ausgeben lass stimmt das aber alles, also der Name, und die Datei existiert auch in dem Zip Archiv. Geb ich die erste Zeile von Hand in den Quellcode ein funktioniert das auch ganz normal, nur wenn ichs so mach nich :/

Jemand ne Idee was ich falsch mach/wie ichs richtig machen kann?

MfG Killmichnich

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

12.09.2009, 16:52

Zitat von »"killmichnich"«

char datei[128]; //der name der datei
char ziel[128]; //wo die datei gespeichert werden soll
ZeroMemory(&datei, sizeof(datei));
ZeroMemory(&ziel, sizeof(ziel));

Damit zerschießt du dir den Stack! Überleg mal warum.

Werbeanzeige