Gemeserverstatus abfragen



  • The-Kenny schrieb:

    Wieso den Umweg ueber Python nehmen?

    duerfte der kleinere Umweg sein, als sowas krampfhaft in C++ umsetzen zu wollen


  • Administrator

    Ping? Was bringt ein Ping um festzustellen, ob ein Gameserver online oder offline ist? Ein Gameserver kann offline sein, aber die Maschine trotzdem an, wodurch der Ping ein falsches Resultat liefert.

    Man braucht da schon einen entsprechenden Zugang, indem entsprechende Informationen angeboten werden. Entweder kennt man das Protokoll, über welches der Server mit dem Spiel kommuniziert, dann kann man so eine Abfrage stellen, oder die Betreiber stellen zusätzliche Informationen zur Verfügung, wie zum Beispiel hier:
    http://wiretap.wwiionline.com/xml/servers.xml

    Und zum Umweg über Python ... das soll der kleinere sein? ROFL? Mit WinSockets kann man sowas relativ leicht umsetzen (http://www.c-worker.ch/tuts/raw_icmp.php). Es gibt soweit ich weiss sogar eine COM-Schnittstelle, welche einem direkt ein Ping-Interface anbietet.

    Ansonsten bietet auch Boost.Asio inzwischen eine ICMP Schnittstelle an. Ich muss allerdings gestehen, dass ich noch nicht begriffen habe, wie sie zu bedienen ist, da es an Beispielen und Dokumentation fehlt ...

    Aber wieso Python in C++ einbinden, um einen Ping durchzuführen? Als wenn man mit Kanonen auf Spatzen schiesst.

    Grüssli



  • Dravere schrieb:

    Und zum Umweg über Python ... das soll der kleinere sein? ROFL? ...

    Ehrlich gesagt würde ich persönlich ein Shell-script schreiben, daß in einer Zeile den Port prüft und in der nächsten entscheidet, ob die C++ binarys gestartet werden. Da ich hier aber nicht voraussetzen kann, daß jeder Unix/ Linux nutzt, finde ich, daß Python oder Perl eine wunderbare Ergänzung zu C++ sind.
    Was ich wollte, ist daß man einfach mal "über den Tellerrand hinaus" blickt.

    Gerade in der Spieleprogrammierung werden vorhandene oder eigene Scriptsprachen sinnvoll und oft genutzt, da sie einem eben viel Zeit und Nerven sparen!

    Dravere schrieb:

    Aber wieso Python in C++ einbinden, um einen Ping durchzuführen? Als wenn man mit Kanonen auf Spatzen schiesst.

    Grüssli

    Du schreibst selber, daß die Pingabfrage sinnlos ist. Dafür wären die Python-Makros auch nicht gedacht!

    Eigentlich eher andersrum: Warum C++ nutzen, wenn man einen Ping abfragen will? Das wäre, als wenn man mit Kanonen auf Spatzen schießen will! 😉


  • Administrator

    Ich sage nichts gegen das Einbinden von Scriptsprachen! Dies unterstütze ich, ich verwende selber gerade in einem Programm eine Scriptsprache, allerdings dort eine eigene, da die Spezifikationen so speziell sind.

    Aber jetzt überleg dir mal. Jemand programmiert ein Programm in C++. Es ist vollständig programmiert, alles in C++. Damit er nun allerdings eine Ping Abfrage machen kann, soll er die ganzen Python Runtime Libraries installieren, über C++ ein Pyhton Script laden und ausführen. Weiss du was das für einen zusätzlichen Aufwand ist, nur um EINEN Ping abzuschicken? 😃

    Und wenn wirklich kein anderes Programm da ist, und es wirklich nur eine Abfrage sein soll, dann kann man es ja fast nicht anders sehen, als das es eine Übung sein soll. Dann ist es genau so verkehrt auf eine andere Sprache zu verweisen...

    *plötzlich was anderes bemerkt* ...
    Oder meinst du, dass die Abfrage des Servers per Skript ausgeführt werden soll, damit man später dann andere Skripte reinladen kann, um andere Server abzufragen? Das wäre natürlich was anderes ... aber das solltest du dann auch hinschreiben 😉
    Und zudem ist das nicht in der Anforderung der Threaderstellers vorhanden. Und es gäbe da wohl auch immer noch einfachere Möglichkeiten ...

    Grüssli



  • PLOG! Es geht doch garnicht um einen Ping sondern um eine Q3-Engine! Und deshalb ist Python sinnlos! Weil wenn man nur 5 Zeilen C-Code dafür braucht, haut man diese in die Q3-Engine rein. Was muß ich aber für einen Aufwand betreiben, um ein Python-Script in die Q3-Engine reinzubekommen??? Eben!



  • Bulli schrieb:

    Was muß ich aber für einen Aufwand betreiben, um ein Python-Script in die Q3-Engine reinzubekommen??? Eben!

    via google einfach zu finden:

    #include <Python.h>
    
    // Hier beginnt ein Python Programm
    const char *programm = 
    "import random\n" 
    "print 'Guten Tag, die Zahl ist:', random.randint(0, 100)\n" 
    "print 'Das war ... Python'\n";
    
    int main(int argc, char *argv[]) 
        { 
        Py_Initialize(); 
        PyRun_SimpleString(programm);  // hier wird der Python code ausgeführt
        Py_Finalize(); 
        }
    

    ähem, nicht sehr schwer...


  • Administrator

    Ich versteh gar nichts mehr ... wovon redet ihr Leute überhaupt? Wieso sollte die Q3-Engine verwendet werden bei der Programmierung? Es steht nur, dass es um diese geht, aber in welchem Zusammenhang steht nirgends. Ich bin jetzt davon ausgegangen, dass es ein Spiel hat, welches diese verwendet und jemand will nun von ausserhalb den Status abfragen.

    @XHansWurstX,
    Dir ist aber schon klar, dass man noch zur ganze Pythonbibliothek linken muss? Anders gesagt, braucht man noch die ganze Pythonbibliothek zu installieren, nur um dein kleines Programm auszuführen. Leicht übertrieben, nicht?

    Und wieso wollt ihr unbedingt eine Pingabfrage per Python machen ... WIESO ÜBERHAUPT PYHTON?

    Grüssli



  • Dravere schrieb:

    Es steht nur, dass es um diese geht, aber in welchem Zusammenhang steht nirgends. Ich bin jetzt davon ausgegangen, dass es ein Spiel hat, welches diese verwendet und jemand will nun von ausserhalb den Status abfragen.

    Das dachte ich auch...

    Dravere schrieb:

    Und wieso wollt ihr unbedingt eine Pingabfrage per Python machen ... WIESO ÜBERHAUPT PYHTON?

    hehe, vergiß doch mal den Ping 😉 Die Idee mit Python kam mir, wg der Portabfrage.
    Für solche Sachen finde ich eben Scripte(eigentlich eher Bash/ Shell) einfacher und schlanker als C++

    Dravere schrieb:

    @XHansWurstX,
    Dir ist aber schon klar, dass man noch zur ganze Pythonbibliothek linken muss? Anders gesagt, braucht man noch die ganze Pythonbibliothek zu installieren, nur um dein kleines Programm auszuführen. Leicht übertrieben, nicht?

    Na klar...
    1: ka, was der Thread-eröffner mit seinem Programm vorhat? Kommerziell? Für sich?
    2:Ich würde es auch jedem Programmierer empfehlen. Da man mit C++ Erfahrung leicht in solch "niedlichen" Scriptsprachen reinkommt...

    Btw muß man ja auch die Boost Bibliothek erst mal haben um mit der zu arbeiten... Da kommt dann dasselbe bei raus. O.k. man muß weniger Linken...

    Ist Python eigentlich bei Windows bei? Ich meine nicht die devel`s...



  • Ich dachte da an sowas Anliches wie q3infoboom aber das ist in C# und damit kommt mein compiler nicht klar. Abgefragt wird glaub ich damit:

    int send_recv(int sd, u_char *in, int inlen, u_char *out, int outlen, int bug) {
        int     retry;
    
        for(retry = 3; retry; retry--) {
            sendto(sd, in, inlen, 0, (struct sockaddr *)&peer, sizeof(peer));
            if(!timeout(sd)) break;
        }
        if(!retry) {
            if(bug) return(-1);
            fputs("\nError: socket timeout, no reply received\n\n", stdout);
            exit(1);
        }
        outlen = recvfrom(sd, out, outlen, 0, NULL, NULL);
        if(outlen < 0) std_err();
        out[outlen] = 0;
    
        return(outlen);
    }
    

    Aber ist diese Programm ist dafür entwickelt um Server zu crashen, ich will sie ja nicht crashen sondern nur fragen ob sie online sind. "\nError: socket timeout, no reply received\n\n" kommt halt wenn der server nicht online ist ansonsten wird versucht ihn zu crashen. Ich will es so haben dass wenn er nicht online ist return 0 und wenn er online ist return 1.



  • Eine spontane Lösung:

    #include <iostream>
    #include <string>
    #include <winsock.h>
    
    #pragma comment(lib, "ws2_32.lib")
    
    int startWinsock();
    bool isServerOnline(const std::string& ip, unsigned int port);
    
    int main()
    {
    	if (startWinsock() != 0)
    	{
    		std::cerr << "Fehler: Winsock konnte nicht gestartet werden." << std::endl;
    		return 1;
    	}
    
    	if (isServerOnline("87.106.19.147", 81))
    	{
    		std::cout << "Server ist Online." << std::endl;
    	}
    	else
    	{
    		std::cout << "Server ist Offline." << std::endl;
    	}
    
    	return 0;
    }
    
    int startWinsock()
    {
    	WSADATA wsa;
    	return WSAStartup(MAKEWORD(2, 0), &wsa);
    }
    
    bool isServerOnline(const std::string& ip, unsigned int port)
    {
    	SOCKADDR_IN addr;
    	SOCKET s;
    
    	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    	{
    		std::cerr << "Fehler: Socket konnte nicht erstellt werden." << std::endl;
    		return false;
    	}
    
    	memset(&addr, 0, sizeof(SOCKADDR_IN));
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(port);
    	addr.sin_addr.s_addr = inet_addr(ip.c_str());
    
    	if (connect(s, (SOCKADDR *) &addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
    	{
    		return false;
    	}
    
    	closesocket(s);
    	WSACleanup();
    
    	return true;
    }
    

    Sollte für den Zweck doch vollkommen ausreichen? 🙄



  • Ergänzung: Es muss wohl einen speziellen Port für solche Anfragen geben. So klappt es wohl eher doch nicht. 🙄



  • Ich glaub schon das es geht aber mein Compiler (Dev-C++) kommt mit dem code nicht klar. Was für einen Compiler hast du denn?



  • fadafd schrieb:

    Ich glaub schon das es geht aber mein Compiler (Dev-C++) kommt mit dem code nicht klar. Was für einen Compiler hast du denn?

    Vermutlich VC (Dev-C++ ist nicht mehr wirklich aktuell, kostenlose alternativen sind Visual C++ 2008 Express oder Code::Blocks).

    P.S: Wenn du VC++ wählst, bitte bei Projekten a) die Win32-Projekttypen wählen und b) bei Konsolenanwendungen "leeres Projekt". Nur um weitere Fragen zu vermeiden...



  • Code::Blocks geht auch nicht da kommt auch "undefined reference to `_WSAStartup@8'|" das gleiche kommt bei Dev-C++ "undefined reference to `WSAStartup@8'"



  • fadafd schrieb:

    Code::Blocks geht auch nicht da kommt auch "undefined reference to `_WSAStartup@8'|" das gleiche kommt bei Dev-C++ "undefined reference to `WSAStartup@8'"

    Dir fehlt eine Linkeroption für Winsock. Bei VC++ ist das: ws2_32.lib
    Wie das bei deinem Compiler aussieht, weiß ich nicht.



  • Project->Build options->Linker

    libws2_32.a



  • ghgfhfgh schrieb:

    Project->Build options->Linker

    libws2_32.a

    Danke! Kompilieren geht jezt. Aber leider Funktioniert die Funktion doch nicht. Es kommt immer Server ist Offline.


Anmelden zum Antworten