Gemeserverstatus abfragen
-
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...
-
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.