You are not logged in.

  • Login

1

Saturday, April 16th 2011, 5:17am

Auto Restarter

Hallo Leute :)

Ich Lerne gerade C++ und arbeite gerade an meinem neuen Programm.

Erstmal was das programm machen soll.

Das Programm soll wenn z.B. der Login Server abschmiert ihn neu starten.

In einer .bat Datei würde ich es so machen :


Bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@ping 127.0.0.1 -n 3 -w 1000 > nul
echo.
echo.
echo.
echo AuthSvr Auto Restarter initialized ...
title Login Server Auto Restarter
echo.
:AuthSvr
echo  AuthSvr started. 
echo  AuthSvr started.
echo.
start /wait AuthSvrT.exe
echo (Úte%) (%time%) WARNING: AuthSvr got crashed restarting ... 
echo (Úte%) (%time%) WARNING: AuthSvr got crashed restarting ...
echo (Úte%) (%time%) Restart Sucessfully.
echo (Úte%) (%time%) Restart Sucessfully.
echo.
goto AuthSvr


Nun möchte ich das selbe in einem C++ Programm unter bringen da der Server aus folgedem besteht :

Login Server,
Database Server und MainServer.


Das was ich nun nicht weis und auch per Google nicht herrausgefunden habe (vl. nach den falschen stichpunkten gesucht)

wie ich das mit dem (Úte%)/(Úte%) und dem Ping mache das er dann neu startet.

Die Server kann ich ja mit

C/C++ Quellcode

1
system("name.exe");}


Neustarten.

Dafür ahbe ich in meinem C++ programm es so gemacht das man die Namen eingeben kann.

Was ich eigentlich brauche kann man sich ja nun eig. denken.

Es soll ja angezeigt werden wann der Server gecrashed ist und danach soll er neu starten.


Hier mein - bestimmt verbesserungswürdiger Code :

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main(int argc, char *argv[]) 
{
 
SetConsoleTitle( "KalOnline Server Restarter by Goldy - V0.1" ); 
 
char loginname[255];
char dbname[255];
char mainname[255];
 
 
 
 	{
 
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdout,FOREGROUND_RED | FOREGROUND_INTENSITY);
 
 
	cout << "          	Welcome to the Server Restarter by Goldy - (C) 2011\n\n"  << endl;
 	 	}
 
 	 	{
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdout,FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	cout << "          	Type the name of the Login Server : ";
	cin.getline(loginname, 255, '\n');
	cout << "\n          	Type the name of the Database Server : ";
	cin.getline(dbname, 255, '\n');
	cout << "\n          	Type the name of the Main Server : ";
	cin.getline(mainname, 255, '\n');
}   
 
{
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdout,FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
 
 
	cout << "\n\n          	Name of Login Server : " << loginname << endl;
	cout << "          	Name of Database Server : " << dbname << endl;
	cout << "          	Name of Main Server : " << mainname << endl;
	cout << "\n" << endl;
}				 
 
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdout,FOREGROUND_BLUE | FOREGROUND_INTENSITY);
 
 
Sleep(1500);
	cout << "          	" << loginname << " Auto Restarter successfully initialized " << endl;
Sleep(1500);	
	cout << "          	" << dbname <<	" Auto Restarter successfully initialized " << endl;
Sleep(1500);	
	cout << "          	" << mainname <<	" Auto Restarter successfully initialized \n\n" << endl;
 
 
 		system(" PAUSE ");
	return EXIT_SUCCESS;
 
}

This post has been edited 1 times, last edit by "TheDemon" (Apr 16th 2011, 6:30am)


2

Sunday, April 17th 2011, 3:56am

Im Prinzip gibt es mehrere Möglichkeiten.
Die Ping Methode würde ich an dieser Stelle jedoch nicht verwenden.

Eine Möglichkeit wäre es mittels Sockets zu Prüfen ob der Port 80 (HTTP) offen ist, ist dies nicht der Fall wird wohl der Server offline sein.
- Stichwörter: WSAStartup, WSACleanup, socket, Socket Programmierung

Eine andere Möglichkeit wäre es zu Prüfen ob die Server-Anwendung läuft, also der Prozess und ggf. neu zu starten.
- Stichwörter: Process32First, Process32Next, CreateToolhelp32Snapshot

Um eine Anwendung zu startn kannst du entweder die system-Funktion benutzen oder CreateProcess.

Mfg Rushh0ur

3

Sunday, April 17th 2011, 8:44am


Im Prinzip gibt es mehrere Möglichkeiten.
Die Ping Methode würde ich an dieser Stelle jedoch nicht verwenden.

Eine Möglichkeit wäre es mittels Sockets zu Prüfen ob der Port 80 (HTTP) offen ist, ist dies nicht der Fall wird wohl der Server offline sein.
- Stichwörter: WSAStartup, WSACleanup, socket, Socket Programmierung

Eine andere Möglichkeit wäre es zu Prüfen ob die Server-Anwendung läuft, also der Prozess und ggf. neu zu starten.
- Stichwörter: Process32First, Process32Next, CreateToolhelp32Snapshot

Um eine Anwendung zu startn kannst du entweder die system-Funktion benutzen oder CreateProcess.

Mfg Rushh0ur
Okay danke, dann schaue ich mir das 2. mal an :)
Hätte vl. noch dazu sagen sollen das es Programme sind, den Root/Server ansicht meinte ich nicht :)


Was würdest du mir den Empfhelen? system("programm.exe"); oder CreateProcess ?

Nochmals danke :)


MfG

TheDemon

4

Sunday, April 17th 2011, 1:24pm

Ist eigentlich so ziemlich egal, du hättest halt mit CreateProcess den Vorteil, dass du die Anwendung dann überwachen könntest, also ob die erfolgreich gestartet wurde, ob die noch läuft und ob sie beendet wurde.

Mfg Rushh0ur

This post has been edited 1 times, last edit by "Rushh0ur" (Apr 18th 2011, 8:11am)


5

Monday, April 18th 2011, 2:24am

Ich melde mich dann nochmal hier , also ich habe folgendes gemacht :


C/C++ Quellcode

1
2
3
4
5
6
7
Sleep(1500);
	cout << "          	" << loginname << " Auto Restarter successfully initialized " << endl;
	BOOL WINAPI CreateProcess(loginname ".exe");
Sleep(1500);	
	cout << "          	" << dbname <<	" Auto Restarter successfully initialized " << endl;
Sleep(1500);	
	cout << "          	" << mainname <<	" Auto Restarter successfully initialized \n\n" << endl;



Aber das geht leider nicht.

Wie muss ich es schreiben das es geht?

6

Monday, April 18th 2011, 4:58pm

Ich würd dir Vorschlagen erst mal die Basics zu lernen und eventuell solange noch einfach mit system zu Arbeiten.
Auf den Verlinkten seiten sind die Prototpydefinition beschriebene, der Aufurf funktioniert dementsprechend.

Desweiteren musst du den absoltuen Pfad der Funktion CreateProcess übergeben, die Schaut sonst nur relativ zum Arbeitspfad nach der auszführenden Datei.
Schau dir auch mal Strings an um Zeichenketten zu verknüpfen.

Ein Aufruf von CreateProcess könnte so aussehen:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
string sLoginName = "C:\\Windows\\explorer.exe";
 
STARTUPINFO		siStartupInfo;
PROCESS_INFORMATION	piProcessInfo;
 
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
 
siStartupInfo.cb		= sizeof(siStartupInfo);
siStartupInfo.wShowWindow	= SW_SHOW;
 
CreateProcess(sLoginName.c_str(), NULL, NULL, NULL, false, 0, NULL, NULL, &siStartupInfo, &piProcessInfo);


Mfg Rushh0ur

7

Monday, April 18th 2011, 10:24pm

Problem war das ich nicht wusste wie ich bei system meine Variable benutzen soll.

Social bookmarks