Auto Restarter

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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 :


    Quellcode

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


    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

    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 :

    Quellcode

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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von TheDemon ()

  • 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
  • Rushh0ur schrieb:


    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
  • Ich melde mich dann nochmal hier , also ich habe folgendes gemacht :


    Quellcode

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



    Aber das geht leider nicht.

    Wie muss ich es schreiben das es geht?
  • 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:

    Quellcode

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


    Mfg Rushh0ur