Jelajahi Sumber

Benutzt jetzt die neue Netzwerk Bibliothek

Kolja Strohm 6 tahun lalu
induk
melakukan
5f949587b4
8 mengubah file dengan 220 tambahan dan 634 penghapusan
  1. TEMPAT SAMPAH
      Start/Framework.dll
  2. 0 43
      Start/Keys.h
  3. TEMPAT SAMPAH
      Start/Network.dll
  4. 0 197
      Start/Netzwerk.cpp
  5. 0 32
      Start/Netzwerk.h
  6. 3 9
      Start/Start.vcxproj
  7. 0 14
      Start/Start.vcxproj.filters
  8. 217 339
      Start/start.cpp

TEMPAT SAMPAH
Start/Framework.dll


+ 0 - 43
Start/Keys.h

@@ -1,43 +0,0 @@
-#pragma once
-
-class Keys
-{
-    // Konstruktor
-    Keys();
-public:
-    enum Server;
-    enum Key;
-
-    // Gibt den Schlüssel eines Servers zurück
-    //  key: Ein Zeiger auf ein array von bytes. Wird als ausgabe verwendet. Enthält nach aufruf den gewünschten Key
-    //  length: Enthält nach aufruf die Länge des Schlüssels
-    //  sTyp: Der Servertyp, zu dem der Schlüssel ermittelt werden soll
-    //  kTyp: Die art des Schlüssels der ermittelt werden soll
-    static void getServerKey( char **key, int &length, Server sTyp, Key kTyp );
-
-    // Servertypen
-    enum Server
-    {
-        MAIN = 0,
-        ANMELDUNG = 1,
-        CHAT = 2,
-        EDITOR = 3,
-        HISTORIE = 4,
-        INFORMATION = 5,
-        KARTEN = 6,
-        LOGIN = 7,
-        NEWS = 8,
-        REGISTER = 9,
-        SHOP = 10,
-        SPIEL = 11,
-        PATCH = 12,
-        ERHALTUNG = 13
-    };
-
-    // Keytypen
-    enum Key
-    {
-        EMPFANGEN = 0,
-        SENDEN = 0
-    };
-};

TEMPAT SAMPAH
Start/Network.dll


+ 0 - 197
Start/Netzwerk.cpp

@@ -1,197 +0,0 @@
-#include "Netzwerk.h"
-#include "Keys.h"
-
-// Inhalt der ErhaltungKlient Klasse aus Netzwerk.h
-// Konstruktor
-ErhaltungKlient::ErhaltungKlient( int klientId )
-: Thread()
-{
-	klient = 0;
-	this->klientId = klientId;
-	abmel = 0;
-	trenn = 0;
-	ref = 1;
-}
-
-// Destruktor
-ErhaltungKlient::~ErhaltungKlient()
-{
-	ende();
-	if( klient )
-		klient->release();
-}
-
-// nicht constant
-void ErhaltungKlient::verbinden( int mSP, Text *zMSIp, char *netwSchlüssel, char netwSchlüsselLän )
-{
-	if( !klient )
-	{
-		klient = new Klient();
-        int l = 0;
-        char *key;
-        Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
-        klient->setSendeKey( key, l );
-        delete[] key;
-        Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
-        klient->setEmpfangKey( key, l );
-        delete[] key;
-		if( !klient->verbinde( mSP, zMSIp->getText() ) )
-		{
-			klient = klient->release();
-			return;
-		}
-		klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
-		klient->sendeEncrypted( "\1", 1 );
-		klient->sendeEncrypted( (char*)&klientId, 4 );
-		char serverReturn = 0;
-		klient->getNachrichtEncrypted( &serverReturn, 1 );
-		if( serverReturn == 3 )
-		{
-			char län = 0;
-			klient->getNachrichtEncrypted( &län, 1 );
-			char *nachricht = new char[ län + 1 ];
-			nachricht[ län ] = 0;
-			klient->getNachrichtEncrypted( nachricht, län );
-			delete[]nachricht;
-			klient->sendeEncrypted( "\3", 1 );
-			klient->getNachrichtEncrypted( &serverReturn, 1 );
-			klient->trenne();
-			klient = klient->release();
-			return;
-		}
-		klient->setSendeKey( (char*)netwSchlüssel, netwSchlüsselLän );
-		klient->setEmpfangKey( (char*)netwSchlüssel, netwSchlüsselLän );
-		klient->sendeEncrypted( "\6\x8", 2 );
-		char byte = 0;
-		klient->getNachrichtEncrypted( &byte, 1 );
-		if( byte == 2 )
-		{
-			unsigned char lsIp[ 4 ];
-			klient->getNachrichtEncrypted( (char *)lsIp, 4 );
-			unsigned short lsPort = 0;
-			klient->getNachrichtEncrypted( (char*)&lsPort, 2 );
-			klient->sendeEncrypted( "\3", 1 );
-			klient->getNachrichtEncrypted( &serverReturn, 1 );
-			klient->trenne();
-			Text *lsIpT = new Text( "" );
-			lsIpT->append( (int)lsIp[ 0 ] );
-			lsIpT->append( "." );
-			lsIpT->append( (int)lsIp[ 1 ] );
-			lsIpT->append( "." );
-			lsIpT->append( (int)lsIp[ 2 ] );
-			lsIpT->append( "." );
-			lsIpT->append( (int)lsIp[ 3 ] );
-            int l = 0;
-            char *key;
-            Keys::getServerKey( &key, l, Keys::ERHALTUNG, Keys::SENDEN );
-            klient->setSendeKey( key, l );
-            delete[] key;
-            Keys::getServerKey( &key, l, Keys::ERHALTUNG, Keys::EMPFANGEN );
-            klient->setEmpfangKey( key, l );
-            delete[] key;
-			klient->verbinde( lsPort, lsIpT->getText() );
-			lsIpT = lsIpT->release();
-			klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
-			klient->sendeEncrypted( "\3", 1 );
-			klient->getNachrichtEncrypted( &serverReturn, 1 );
-			klient->trenne();
-		}
-		if( byte == 3 )
-		{
-			klient->getNachrichtEncrypted( &byte, 1 );
-			char *f = new char[ byte + 1 ];
-			f[ byte ] = 0;
-			klient->getNachrichtEncrypted( f, byte );
-			delete[]f;
-			klient->sendeEncrypted( "\3", 1 );
-			klient->getNachrichtEncrypted( &serverReturn, 1 );
-			klient->trenne();
-			klient = klient->release();
-			return;
-		}
-	}
-	if( klient->verbinde( klient->getServerPort(), klient->getServerIp() ) )
-	{
-		klient->sende( "\0", 1 ); // Verschlüsselung Aktivieren
-		if( klient->sendeEncrypted( "\1", 1 ) )
-		{
-			klient->sendeEncrypted( (char*)&klientId, 4 );
-			char serverReturn = 0;
-			klient->getNachrichtEncrypted( &serverReturn, 1 );
-			if( serverReturn == 3 )
-			{
-				char byte = 0;
-				klient->getNachrichtEncrypted( &byte, 1 );
-				char *f = new char[ byte + 1 ];
-				f[ byte ] = 0;
-				klient->getNachrichtEncrypted( f, byte );
-				delete[]f;
-				klient->sendeEncrypted( "\3", 1 );
-				klient->getNachrichtEncrypted( &serverReturn, 1 );
-				klient->trenne();
-				return;
-			}
-			klient->setSendeKey( (char*)netwSchlüssel, netwSchlüsselLän );
-			klient->setEmpfangKey( (char*)netwSchlüssel, netwSchlüsselLän );
-			start();
-		}
-		else
-			klient = klient->release();
-	}
-	else
-		klient = klient->release();
-}
-
-void ErhaltungKlient::abmelden()
-{
-	abmel = 1;
-}
-
-void ErhaltungKlient::trennen()
-{
-	trenn = 1;
-}
-
-void ErhaltungKlient::thread()
-{
-	while( 1 )
-	{
-		char n = 0;
-		klient->getNachrichtEncrypted( &n, 1 );
-		if( n != 1 )
-		{
-			Sleep( 250 );
-			continue;
-		}
-		if( trenn )
-		{
-			if( abmel )
-			{
-				klient->sendeEncrypted( "\1", 1 );
-				klient->getNachrichtEncrypted( &n, 1 );
-			}
-			klient->trenne();
-			run = 0;
-			return;
-		}
-		else
-			klient->sendeEncrypted( "\0", 1 );
-	}
-}
-
-// constant
-
-// Reference Counting
-ErhaltungKlient *ErhaltungKlient::getThis()
-{
-	ref++;
-	return this;
-}
-
-ErhaltungKlient *ErhaltungKlient::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
-}

+ 0 - 32
Start/Netzwerk.h

@@ -1,32 +0,0 @@
-#include <Klient.h>
-#include <Thread.h>
-#include <Text.h>
-
-using namespace Network;
-using namespace Framework;
-
-class ErhaltungKlient : public Thread
-{
-private:
-	Klient *klient;
-	int klientId;
-	bool abmel;
-	bool trenn;
-	int ref;
-
-public:
-	// Konstruktor
-	ErhaltungKlient( int klientId );
-	// Destruktor
-	~ErhaltungKlient();
-	// nicht constant
-	void verbinden( int mSP, Text *zMSIp, char *netwSchlüssel, char netwSchlüsselLän );
-	void abmelden();
-	void trennen();
-	virtual void thread();
-	// constant
-
-	// Reference Counting
-	ErhaltungKlient *getThis();
-	ErhaltungKlient *release();
-};

+ 3 - 9
Start/Start.vcxproj

@@ -71,18 +71,18 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <LinkIncremental>true</LinkIncremental>
-    <IncludePath>..\..\..\..\OpenSSL\x64\Debug\Include;..\..\..\..\Allgemein\Network\Network;..\..\..\..\Allgemein\Framework;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\..\..\OpenSSL\x64\Debug\Include;..\..\..\..\Allgemein\Network\Network;..\..\..\..\Allgemein\Framework;..\..\KSGNetwork\Include;$(IncludePath)</IncludePath>
     <LibraryPath>..\..\..\..\Allgemein\Framework\x64\Debug;..\..\..\..\Allgemein\Network\x64\Debug;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <LinkIncremental>false</LinkIncremental>
-    <IncludePath>..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\..\..\OpenSSL\x32\Release\Include;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\KSGNetwork\Include;..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;..\..\..\..\OpenSSL\x32\Release\Include;$(IncludePath)</IncludePath>
     <LibraryPath>..\..\..\..\Allgemein\Framework\Release;..\..\..\..\Allgemein\Network\Release;$(LibraryPath)</LibraryPath>
     <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <LinkIncremental>false</LinkIncremental>
-    <IncludePath>..\..\..\..\OpenSSL\x64\Release\Include;..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;$(IncludePath)</IncludePath>
+    <IncludePath>..\..\KSGNetwork\Include;..\..\..\..\OpenSSL\x64\Release\Include;..\..\..\..\Allgemein\Framework;..\..\..\..\Allgemein\Network\Network;$(IncludePath)</IncludePath>
     <LibraryPath>..\..\..\..\Allgemein\Framework\x64\Release;..\..\..\..\Allgemein\Network\x64\Release;$(LibraryPath)</LibraryPath>
     <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
   </PropertyGroup>
@@ -170,14 +170,8 @@
     </CustomBuildStep>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="Keys.cpp" />
-    <ClCompile Include="Netzwerk.cpp" />
     <ClCompile Include="start.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="Keys.h" />
-    <ClInclude Include="Netzwerk.h" />
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>

+ 0 - 14
Start/Start.vcxproj.filters

@@ -18,19 +18,5 @@
     <ClCompile Include="start.cpp">
       <Filter>Quelldateien</Filter>
     </ClCompile>
-    <ClCompile Include="Netzwerk.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="Keys.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="Netzwerk.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
-    <ClInclude Include="Keys.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
   </ItemGroup>
 </Project>

+ 217 - 339
Start/start.cpp

@@ -1,353 +1,231 @@
-#include "Netzwerk.h"
 #include <main.h>
 #include <Datei.h>
 #include <Fenster.h>
 #include <Globals.h>
 #include <InitDatei.h>
-#include "Keys.h"
+#include <KSGNetwork.h> 
 
 int KSGStart Framework::Start( Startparam p )
 {
-	Network::Start( 10 );
-	char serverReturn = 0;
-
-	HANDLE Mutex = OpenMutex( MUTEX_ALL_ACCESS, false, "KSG_Client" );
-	if( Mutex == NULL )
-	{
-		Mutex = CreateMutex( NULL, true, "KSG_Client" );
-		DateiRemove( new Text( "data/tmp/k.id" ) );
-		DateiRemove( new Text( "data/tmp/keinabsturz" ) );
-	}
-	else
-	{
-		WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Programm läuft bereits. Wenn dieß nicht der Fall ist,\nmusst du den Komputer neu starten." ), MB_ICONERROR );
-		Network::Exit();
-		return 0;
-	}
-
-	if( DateiExistiert( new Text( "data/update/unable/list.patch" ) ) )
-	{
-		PROCESS_INFORMATION prozessinfo3;
-		STARTUPINFO startinfo3;
-		ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
-		startinfo3.cb = sizeof( STARTUPINFOW );
-
-		if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
-		{
-			Network::Exit();
-			DateiRemove( new Text( "data/tmp" ) );
-			exit( 0 );
-		}
-		else
-		{
-			WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten.\nBitte starte den Komputer neu. Sollte diese Meldung weiterhin\nerscheinen, so musst du das Spiel neu Installieren." ), MB_ICONERROR );
-			exit( 0 );
-		}
-	}
-
-	PROCESS_INFORMATION prozessinfo1;
-	STARTUPINFO startinfo1;
-	startinfo1.cb = sizeof( STARTUPINFOW );
-	ZeroMemory( &startinfo1, sizeof( STARTUPINFOW ) );
-	bool pe = 0;
-
-	if( CreateProcess( 0, "data/start/icon.exe", 0, 0, 0, 0, 0, 0, &startinfo1, &prozessinfo1 ) == 1 )
-	{
-		CloseHandle( prozessinfo1.hThread );
-		pe = 1;
-	}
-
-	InitDatei *iDat = new InitDatei( "data/optionen.ini" );
-	iDat->laden();
-	if( !iDat->zWert( "ServerIP" ) )
-		iDat->addWert( "ServerIP", "127.0.0.1" );
-	if( !iDat->zWert( "ServerPort" ) )
-		iDat->addWert( "ServerPort", "4225" );
-	iDat->speichern();
-	Text *ipT = iDat->getWert( "ServerIP" );
-	unsigned short port = (unsigned short)TextZuInt( iDat->zWert( "ServerPort" )->getText(), 10 );
-	iDat->release();
-    SSLKlient *klientSSL = new SSLKlient();
-    int l = 0;
-	if( !klientSSL->verbinde( port, ipT->getText() ) )
-	{
-		Text *message = new Text( "Der Server wurde nicht gefunden.\nServer Ip:" );
-		message->append( ipT->getText() );
-		message->append( "\nServer Port:" );
-		message->append( (int)port );
-		WMessageBox( 0, new Text( "Fehler" ), message, MB_ICONERROR );
-		ipT->release();
-        klientSSL->release();
-		Network::Exit();
-		return 0;
-	}
-    klientSSL->sende( "\1", 5 );
-	char byte = 0;
-    klientSSL->getNachricht( &byte, 1 );
-	if( byte == 3 )
-	{
-        klientSSL->getNachricht( &byte, 1 );
-		char *message = new char[ byte + 1 ];
-		message[ byte ] = 0;
-        klientSSL->getNachricht( message, byte );
-		Text *nachricht = new Text( "Fehler während der Identifikation beim Server.\nServer Rückgabe:\n " );
-		nachricht->append( message );
-		WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
-		delete[]message;
-		ipT->release();
-        klientSSL->sende( "\3", 1 );
-		klientSSL->getNachricht( &serverReturn, 1 );
-		klientSSL->trenne();
-		klientSSL->release();
-		Network::Exit();
-		return 0;
-	}
-	int klientNummer = 0;
-	char *netwSchlüssel = 0;
-	char netwSchlüsselLän = 0;
-    int normPort = 0;
-	if( byte == 1 )
-	{
-        klientSSL->getNachricht( (char*)&normPort, 4 );
-		klientSSL->getNachricht( (char*)&klientNummer, 4 );
-		klientSSL->getNachricht( &netwSchlüsselLän, 1 );
-		if( netwSchlüsselLän )
-		{
-			netwSchlüssel = new char[ netwSchlüsselLän ];
-            klientSSL->getNachricht( netwSchlüssel, netwSchlüsselLän );
-			Datei *dat = new Datei();
-			dat->setDatei( "data/tmp/schlüssel.netw" );
-			dat->erstellen();
-			dat->open( Datei::Style::schreiben );
-			dat->schreibe( &netwSchlüsselLän, 1 );
-			dat->schreibe( netwSchlüssel, netwSchlüsselLän );
-			dat->close();
-			dat->release();
-		}
-	}
-	else
-	{
-		WMessageBox( 0, new Text( "Server Fehler" ), new Text( "Unbekannte Rückgabe vom Server.\nEventuell ist deine Version des Spiels veraltet." ), MB_ICONERROR );
-		ipT->release();
-		klientSSL->sende( "\3", 1 );
-		klientSSL->getNachricht( &serverReturn, 1 );
-		klientSSL->trenne();
-		klientSSL->release();
-		Network::Exit();
-		delete[] netwSchlüssel;
-		return 0;
-	}
-	Datei *dat = new Datei();
-	dat->setDatei( "data/tmp/k.id" );
-	dat->erstellen();
-	dat->open( Datei::Style::schreiben );
-	dat->schreibe( (char*)&klientNummer, 4 );
-	dat->close();
+    Network::Start( 10 );
+    char serverReturn = 0;
+
+    HANDLE Mutex = OpenMutex( MUTEX_ALL_ACCESS, false, "KSG_Client" );
+    if( Mutex == NULL )
+    {
+        Mutex = CreateMutex( NULL, true, "KSG_Client" );
+        DateiRemove( new Text( "data/tmp/k.id" ) );
+        DateiRemove( new Text( "data/tmp/keinabsturz" ) );
+    }
+    else
+    {
+        WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Programm läuft bereits. Wenn dieß nicht der Fall ist,\nmusst du den Komputer neu starten." ), MB_ICONERROR );
+        Network::Exit();
+        return 0;
+    }
+
+    if( DateiExistiert( new Text( "data/update/unable/list.patch" ) ) )
+    {
+        PROCESS_INFORMATION prozessinfo3;
+        STARTUPINFO startinfo3;
+        ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
+        startinfo3.cb = sizeof( STARTUPINFOW );
+
+        if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
+        {
+            Network::Exit();
+            DateiRemove( new Text( "data/tmp" ) );
+            exit( 0 );
+        }
+        else
+        {
+            WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten.\nBitte starte den Komputer neu. Sollte diese Meldung weiterhin\nerscheinen, so musst du das Spiel neu Installieren." ), MB_ICONERROR );
+            exit( 0 );
+        }
+    }
+
+    PROCESS_INFORMATION prozessinfo1;
+    STARTUPINFO startinfo1;
+    startinfo1.cb = sizeof( STARTUPINFOW );
+    ZeroMemory( &startinfo1, sizeof( STARTUPINFOW ) );
+    bool pe = 0;
+
+    if( CreateProcess( 0, "data/start/icon.exe", 0, 0, 0, 0, 0, 0, &startinfo1, &prozessinfo1 ) == 1 )
+    {
+        CloseHandle( prozessinfo1.hThread );
+        pe = 1;
+    }
+
+    // Laden des Main Clients
+    HINSTANCE networkDLL = LoadLibrary( "data/bin/KSGNetwork.dll" );
+    if( !networkDLL )
+    {
+        WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' konnte nicht geladen werden. Fallst diese Datei nicht existiert muss das Spiel neu Installiert werden." ), MB_ICONERROR );
+        exit( 0 );
+    }
+    KSGClient::KSGNetworkCreateMain getMainClient = ( KSGClient::KSGNetworkCreateMain )GetProcAddress( networkDLL, KSGNETWORK_CREATE_MAIN );
+    if( !getMainClient )
+    {
+        WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGNETWORK_CREATE_MAIN "' wurde in der DLL Datei 'data/bin/KSGNetwork.dll' nicht gefunden. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
+        exit( 0 );
+    }
+    KSGClient::MainServerClient *mainClient = getMainClient();
+    if( !mainClient )
+    {
+        WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' scheint fehlerhaft zu sein. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
+        exit( 0 );
+    }
+
+    // Laden der Adresse des Main Servers
+    InitDatei *iDat = new InitDatei( "data/optionen.ini" );
+    iDat->laden();
+    if( !iDat->zWert( "ServerIP" ) )
+        iDat->addWert( "ServerIP", "127.0.0.1" );
+    if( !iDat->zWert( "ServerPort" ) )
+        iDat->addWert( "ServerPort", "4225" );
+    iDat->speichern();
+    Text *ipT = iDat->zWert( "ServerIP" );
+    unsigned short port = (unsigned short)TextZuInt( iDat->zWert( "ServerPort" )->getText(), 10 );
+    iDat->release();
+
+    // Registrieren beim Server
+    if( !mainClient->registerSSL( ipT->getText(), port ) )
+    {
+        Text err = "Fehler beim Registrieren des Clients: ";
+        err += mainClient->getLetzterFehler();
+        WMessageBox( 0, new Text( "Fehler" ), err.getThis(), MB_ICONERROR );
+        exit( 0 );
+    }
+
+    // Speichere Server Adresse für andere Anwendungen
+    int klientNummer = mainClient->getClientId();
+    Datei *dat = new Datei();
+    dat->setDatei( "data/tmp/k.id" );
+    dat->erstellen();
+    dat->open( Datei::Style::schreiben );
+    dat->schreibe( (char*)&klientNummer, 4 );
+    dat->close();
     dat->setDatei( "data/tmp/m.port" );
     dat->erstellen();
     dat->open( Datei::Style::schreiben );
+    int normPort = mainClient->getServerPort();
     dat->schreibe( (char*)&normPort, 4 );
     dat->close();
-	dat->release();
-	klientSSL->sende( "\3", 1 );
-	klientSSL->getNachricht( &serverReturn, 1 );
-	klientSSL->trenne();
-	klientSSL->release();
-
-	ErhaltungKlient *erhaltung = new ErhaltungKlient( klientNummer );
-	erhaltung->verbinden( normPort, ipT, netwSchlüssel, netwSchlüsselLän );
-
-	if( pe )
-	{
-		while( WaitForSingleObject( prozessinfo1.hProcess, 1000 ) == WAIT_TIMEOUT );
-		CloseHandle( prozessinfo1.hProcess );
-	}
-
-	PROCESS_INFORMATION prozessinfo2;
-	STARTUPINFO startinfo2;
-	startinfo2.cb = sizeof( STARTUPINFOW );
-	ZeroMemory( &startinfo2, sizeof( STARTUPINFOW ) );
-
-	if( CreateProcess( 0, "data/patch/bin/patcher.exe", 0, 0, 0, 0, 0, 0, &startinfo2, &prozessinfo2 ) == 1 )
-	{
-		CloseHandle( prozessinfo2.hThread );
-		while( WaitForSingleObject( prozessinfo2.hProcess, 5000 ) == WAIT_TIMEOUT );
-		unsigned long erfolg = 0;
-		GetExitCodeProcess( prozessinfo2.hProcess, &erfolg );
-		if( erfolg != 0 && DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
-		{
-			bool gamestart = erfolg == 2;
-			if( erfolg == 1 )
-			{
-				PROCESS_INFORMATION prozessinfo3;
-				STARTUPINFO startinfo3;
-				startinfo3.cb = sizeof( STARTUPINFOW );
-				ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
-
-				if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
-				{
-					if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
-						erhaltung->abmelden();
-					erhaltung->trennen();
-					erhaltung->warteAufThread( 5000 );
-					erhaltung->release();
-					Klient *klient = new Klient();
-                    int l = 0;
-                    char *key;
-                    Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
-                    klient->setSendeKey( key, l );
-                    delete[] key;
-                    Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
-                    klient->setEmpfangKey( key, l );
-                    delete[] key;
-					if( !klient->verbinde( normPort, ipT->getText() ) )
-					{
-						WMessageBox( 0, new Text( "Fehler" ), new Text( "Die Verbindung zum Server ist abgebrochen." ), MB_ICONERROR );
-						ipT->release();
-						klient->release();
-						Network::Exit();
-						delete[] netwSchlüssel;
-						return 0;
-					}
-					klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
-					klient->sendeEncrypted( "\1", 1 );
-					klient->sendeEncrypted( (char*)&klientNummer, 4 );
-					klient->getNachrichtEncrypted( &serverReturn, 1 );
-					if( serverReturn == 3 )
-					{
-						klient->getNachrichtEncrypted( &byte, 1 );
-						char *message = new char[ byte + 1 ];
-						message[ byte ] = 0;
-						klient->getNachrichtEncrypted( message, byte );
-						Text *nachricht = new Text( "Fehler während der Identifikation beim Server.\nServer Rückgabe:\n " );
-						nachricht->append( message );
-						WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
-						delete[] message;
-					}
-					else
-					{
-						klient->setSendeKey( netwSchlüssel, netwSchlüsselLän );
-						klient->setEmpfangKey( netwSchlüssel, netwSchlüsselLän );
-					}
-					klient->sendeEncrypted( "\7", 1 );
-					klient->getNachrichtEncrypted( &serverReturn, 1 );
-					if( serverReturn == 3 )
-					{
-						klient->getNachrichtEncrypted( &byte, 1 );
-						char *message = new char[ byte + 1 ];
-						message[ byte ] = 0;
-						klient->getNachrichtEncrypted( message, byte );
-						Text *nachricht = new Text( "Fehler während der Abmeldung beim Server.\nServer Rückgabe:\n " );
-						nachricht->append( message );
-						WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
-						delete[]message;
-					}
-					klient->sendeEncrypted( "\3", 1 );
-					klient->getNachrichtEncrypted( &serverReturn, 1 );
-					klient->trenne();
-					ipT->release();
-					klient->release();
-					Network::Exit();
-
-					DateiRemove( new Text( "data/tmp" ) );
-
-					exit( 0 );
-				}
-				else
-					gamestart = 0;
-				if( !gamestart )
-					WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten." ), MB_ICONERROR );
-			}
-			if( gamestart )
-			{
-				PROCESS_INFORMATION prozessinfo3;
-				STARTUPINFO startinfo3;
-				startinfo3.cb = sizeof( STARTUPINFOW );
-				ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
-				DateiRemove( new Text( "data/tmp/keinabsturz" ) );
-
-				if( CreateProcess( 0, "\"data/client/bin/game client.exe\"", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
-				{
-					CloseHandle( prozessinfo3.hThread );
-					while( WaitForSingleObject( prozessinfo3.hProcess, 5000 ) == WAIT_TIMEOUT );
-					CloseHandle( prozessinfo3.hProcess );
-				}
-				else
-					WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Spiel konnte nicht gestartet werden." ), MB_ICONERROR );
-			}
-		}
-		CloseHandle( prozessinfo2.hProcess );
-	}
-	else
-	{
-		WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Patcher konnte nicht gestartet werden." ), MB_ICONERROR );
-	}
-	if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
-		erhaltung->abmelden();
-	erhaltung->trennen();
-	erhaltung->warteAufThread( 5000 );
-	erhaltung->release();
-
-	Klient *klient = new Klient();
-    char *key;
-    Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
-    klient->setSendeKey( key, l );
-    delete[] key;
-    Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
-    klient->setEmpfangKey( key, l );
-    delete[] key;
-	if( !klient->verbinde( normPort, ipT->getText() ) )
-	{
-		WMessageBox( 0, new Text( "Fehler" ), new Text( "Die Verbindung zum Server ist abgebrochen." ), MB_ICONERROR );
-		ipT->release();
-		klient->release();
-		Network::Exit();
-		delete[] netwSchlüssel;
-		return 0;
-	}
-	klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
-	klient->sendeEncrypted( "\1", 1 );
-	klient->sendeEncrypted( (char*)&klientNummer, 4 );
-	klient->getNachrichtEncrypted( &serverReturn, 1 );
-	if( serverReturn == 3 )
-	{
-		klient->getNachrichtEncrypted( &byte, 1 );
-		char *message = new char[ byte + 1 ];
-		message[ byte ] = 0;
-		klient->getNachrichtEncrypted( message, byte );
-		Text *nachricht = new Text( "Fehler während der Identifikation beim Server.\nServer Rückgabe:\n " );
-		nachricht->append( message );
-		WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
-		delete[]message;
-	}
-	else
-	{
-		klient->setSendeKey( netwSchlüssel, netwSchlüsselLän );
-		klient->setEmpfangKey( netwSchlüssel, netwSchlüsselLän );
-	}
-	klient->sendeEncrypted( "\7", 1 );
-	klient->getNachrichtEncrypted( &serverReturn, 1 );
-	if( serverReturn == 3 )
-	{
-		klient->getNachrichtEncrypted( &byte, 1 );
-		char *message = new char[ byte + 1 ];
-		message[ byte ] = 0;
-		klient->getNachrichtEncrypted( message, byte );
-		Text *nachricht = new Text( "Fehler während der Abmeldung beim Server.\nServer Rückgabe:\n " );
-		nachricht->append( message );
-		WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
-		delete[]message;
-	}
-	klient->sendeEncrypted( "\3", 1 );
-	klient->getNachrichtEncrypted( &serverReturn, 1 );
-	klient->trenne();
-	ipT->release();
-	klient->release();
-	Network::Exit();
-
-	DateiRemove( new Text( "data/tmp" ) );
-
-	delete[] netwSchlüssel;
-
-	return 0;
+    dat->setDatei( "data/tmp/m.ip" );
+    dat->erstellen();
+    dat->open( Datei::Style::schreiben );
+    char *serverIp = mainClient->getServerIp();
+    unsigned char len = (unsigned char)textLength( serverIp );
+    dat->schreibe( (char*)&len, 1 );
+    dat->schreibe( (char*)&serverIp, len );
+    dat->close();
+    dat->release();
+
+    KSGClient::ErhaltungServerClient *erhaltung = mainClient->createErhaltungServerClient();
+    if( !erhaltung )
+    {
+        Text err = "Fehler beim erstellen des Erhaltung Servers: ";
+        err += mainClient->getLetzterFehler();
+        WMessageBox( 0, new Text( "Warnung" ), err.getThis(), MB_ICONWARNING );
+    }
+    else
+    {
+        if( !erhaltung->verbinde() )
+        {
+            Text err = "Fehler beim verbinden mit dem Erhaltung Server: ";
+            err += erhaltung->getLetzterFehler();
+            WMessageBox( 0, new Text( "Warnung" ), err.getThis(), MB_ICONWARNING );
+        }
+    }
+
+    if( pe )
+    {
+        while( WaitForSingleObject( prozessinfo1.hProcess, 1000 ) == WAIT_TIMEOUT );
+        CloseHandle( prozessinfo1.hProcess );
+    }
+
+    PROCESS_INFORMATION prozessinfo2;
+    STARTUPINFO startinfo2;
+    startinfo2.cb = sizeof( STARTUPINFOW );
+    ZeroMemory( &startinfo2, sizeof( STARTUPINFOW ) );
+
+    if( CreateProcess( 0, "data/patch/bin/patcher.exe", 0, 0, 0, 0, 0, 0, &startinfo2, &prozessinfo2 ) == 1 )
+    {
+        CloseHandle( prozessinfo2.hThread );
+        while( WaitForSingleObject( prozessinfo2.hProcess, 5000 ) == WAIT_TIMEOUT );
+        unsigned long erfolg = 0;
+        GetExitCodeProcess( prozessinfo2.hProcess, &erfolg );
+        if( erfolg != 0 && DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
+        {
+            bool gamestart = erfolg == 2;
+            if( erfolg == 1 )
+            {
+                PROCESS_INFORMATION prozessinfo3;
+                STARTUPINFO startinfo3;
+                startinfo3.cb = sizeof( STARTUPINFOW );
+                ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
+
+                if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
+                {
+                    // Trenne Verbindung zum Server
+                    if( erhaltung )
+                    {
+                        if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
+                            erhaltung->abmelden();
+                        erhaltung->trenne();
+                        erhaltung->release();
+                    }
+                    mainClient->unregister();
+                    mainClient->release();
+
+                    ipT->release();
+                    Network::Exit();
+
+                    DateiRemove( new Text( "data/tmp" ) );
+
+                    exit( 0 );
+                }
+                else
+                    gamestart = 0;
+                if( !gamestart )
+                    WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten." ), MB_ICONERROR );
+            }
+            if( gamestart )
+            {
+                PROCESS_INFORMATION prozessinfo3;
+                STARTUPINFO startinfo3;
+                startinfo3.cb = sizeof( STARTUPINFOW );
+                ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
+                DateiRemove( new Text( "data/tmp/keinabsturz" ) );
+
+                if( CreateProcess( 0, "\"data/client/bin/game client.exe\"", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
+                {
+                    CloseHandle( prozessinfo3.hThread );
+                    while( WaitForSingleObject( prozessinfo3.hProcess, 5000 ) == WAIT_TIMEOUT );
+                    CloseHandle( prozessinfo3.hProcess );
+                }
+                else
+                    WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Spiel konnte nicht gestartet werden." ), MB_ICONERROR );
+            }
+        }
+        CloseHandle( prozessinfo2.hProcess );
+    }
+    else
+    {
+        WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Patcher konnte nicht gestartet werden." ), MB_ICONERROR );
+    }
+    // Verbindung zum Server Trennen
+    if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
+        erhaltung->abmelden();
+    erhaltung->trenne();
+    erhaltung->release();
+    mainClient->unregister();
+    mainClient->release();
+
+    ipT->release();
+    Network::Exit();
+
+    DateiRemove( new Text( "data/tmp" ) );
+
+    return 0;
 }