WinSnmp Programm schreiben
-
Hallo Community
Ich bin daran einen SNMP Client zu schreiben, der get und set beherrscht. Ich möchte keinen Wrapper (http://www.codeproject.com/KB/library/WinSNMPWrapper.aspx)!
Des weiteren muss ich noch unterstreichen dass ich sehr lange Google durchsucht habe. Aber auch ich lasse mich gerne noch belehren

Mein Problem liegt hauptsächlich darin, dass mir die MSDN Library (http://msdn.microsoft.com/en-us/library/aa379207%28v=VS.85%29.aspx) wenig Hilfe bietet, denn ich bin noch nicht sehr versiert mit Microsoft Librarys.
Am besten wäre es wenn ihr irgendwelche Tutorials oder Sample codes für die winSNMP Library hättet, oder mir vorschlagen könntet. Würde mich Freuen, denn ich verzweifle langsam... es scheint so das ich der erste bin der Einen SNMP Client für Windows mit winSNMP.h und C++ schreiben möchte.
Bis anhin konnte ich die SNMP Anwendung Initialisieren, doch schon beim öffnen der Session stosse ich auf weitere Probleme...
Mein Bisheriger Code:
#include <stdlib.h> #include <iostream> #include <windows.h> #include <wininet.h> #include <winsnmp.h> using namespace std; #pragma comment(lib, "Wininet.lib") int main () { //FOR STARTUP unsigned long imajor = 2; unsigned long iminor = 2; unsigned long iversion = SNMPAPI_V2_SUPPORT; unsigned long itranslation = SNMPAPI_UNTRANSLATED_V2; unsigned long ion = SNMPAPI_ON; unsigned long icallback = SNMPAPI_CALLBACK; //_______________________________________________ HANDLE hSession; if(SnmpStartup(&imajor,&iminor,&iversion,&itranslation,&ion) == SNMPAPI_SUCCESS) //Microsoft Snmp Implementation starten cout << "Started winSnmp Implementation" << endl; else cout << "failed to open winSNMP Implementation " << endl; // hSession = SnmpCreateSession(0,0,&icallback,0); //FUNKTIONIERT NOCH NICHT if(SnmpCleanup() == SNMPAPI_SUCCESS) //Microsoft Snmp Implementation beenden cout << "Closed winSNMP Implementation" << endl; else cout << "failed to close winSNMP Implementation" << endl; system("pause"); return 1; }Danke im Voraus schon für jede Hilfe!!!
-
Ich bin mir nicht sicher, ob das Ganze überhaupt mit der Konsole funktioniert (ich habs aber auch noch nicht ausprobiert).
MSDN schreibt dazu (zum HWND - Param):Handle to a window of the WinSNMP application to notify when an asynchronous request completes, or when trap notification occurs. This parameter is required for window notification messages for the session.
Achja, falls SnmpCreateSession gelingt, schreibt Mircrosoft ausdrücklich, dass ein
SnmpClose() für jede gestartete Session aufgerufen werden _muss_.
-
Nachtrag: Es müsste mit der Konsole zu funktionieren, du musst
#define _WIN32_WINNT 0x0501vor dem Inkludieren von <windows.h> einfügen (ich glaube, mindestens 0x0500 > Windows 2000). Dann kannst du als HWND für SnmpCreateSession GetConsoleWindow() angeben. Das Alles ist aber ungetestet.
-
Nachtrag#2
Mit deinem Callback dürftest du ebenfalls schwirigkeiten haben. Der typedef sieht ja folgendermaßen aus:typedef SNMPAPI_STATUS (CALLBACK *SNMPAPI_CALLBACK) (IN HSNMP_SESSION hSession, IN HWND hWnd, IN UINT wMsg, IN WPARAM wParam, IN LPARAM lParam, IN LPVOID lpClientData);Also müßte dein CB irgendwie so ausschauen
SNMPAPI_STATUS CALLBACK My_Callback (IN HSNMP_SESSION hSession, IN HWND hWnd, IN UINT wMsg, IN WPARAM wParam, IN LPARAM lParam, IN LPVOID lpClientData);
-
Danke für die schnelle Antwort!
Leider funktioniert dein Nachtrag #1 nicht. Er kennt die die Funktion nicht... aber der Ansatz ist glaube ich nicht schlecht!!
Der callback wirft nach der Definition wenigstens keine Fehler mehr auf, leider weiss ich nicht genau, ob es am ende auch funktioniert.Danke für die Bisherigen Tipps, und ich werde weiter auf dich (VF) euch hoffen

Zusätzliche Info: Ich programmiere für das 2000 Betriebssystem...
Mein aktueller stand: (es hat sich nicht sehr viel geändert.)#define _WIN32_WINNT 0x0500 #include <stdlib.h> #include <iostream> #include <windows.h> #include <wininet.h> #include <winsnmp.h> using namespace std; #pragma comment(lib, "Wininet.lib") int main () { //FOR STARTUP unsigned long imajor = 2; unsigned long iminor = 2; unsigned long iversion = SNMPAPI_V2_SUPPORT; unsigned long itranslation = SNMPAPI_UNTRANSLATED_V2; unsigned long ion = SNMPAPI_ON; //_______________________________________________ SNMPAPI_STATUS CALLBACK My_Callback (IN HSNMP_SESSION hSession, IN HWND hWnd, IN UINT wMsg, IN WPARAM wParam, IN LPARAM lParam, IN LPVOID lpClientData); HSNMP_SESSION hSession; if(SnmpStartup(&imajor,&iminor,&iversion,&itranslation,&ion) == SNMPAPI_SUCCESS) //Microsoft Snmp Implementation starten cout << "Started winSnmp Implementation" << endl; else cout << "failed to open winSNMP Implementation " << endl; hSession = SnmpCreateSession(GetConsoleWindow(),0,My_Callback,0); // GetConsoleWindow is not recognized SnmpClose(hSession); if(SnmpCleanup() == SNMPAPI_SUCCESS) //Microsoft Snmp Implementation beenden cout << "Closed winSNMP Implementation" << endl; else cout << "failed to close winSNMP Implementation" << endl; system("pause"); return 1; }
-
Der Prototyp von My_Callback steht bei dir _in_ der main-Fkt, muss aber davor stehen. Außerdem musst du dann My_Callback irgendwo (kann auch unter main() sein)
definieren, ansonsten gibt es einen Linker-Fehler (unresolved external symbol). Dass GetConsoleWindow() nicht gefunden wird, kann ich mir eigentlich nicht erklären. Definiert ist diese Funktion in WinCon.h, die du aber eigentlich nicht explizit inkludieren musst.
In WinCon.h:#if(_WIN32_WINNT >= 0x0500) #define CONSOLE_FULLSCREEN 1 // fullscreen console #define CONSOLE_FULLSCREEN_HARDWARE 2 // console owns the hardware WINBASEAPI BOOL APIENTRY GetConsoleDisplayMode( OUT LPDWORD lpModeFlags ); WINBASEAPI HWND APIENTRY GetConsoleWindow( VOID ); #endif /* _WIN32_WINNT >= 0x0500 */Bei mir jedenfalls klappt der Aufruf, die Session ist ungleich 0.
if(hSession==SNMPAPI_FAILURE) cout << "Fehler "<< GetLastError() << endl;Es tut mir Leid, ich habe hier nur Win XP und Win 7 zur Verfügung mit einem _WIN32_WINNT 0x0500 habe ich auch keine Probleme. Hast du eventuell noch ein uraltes Platform-SDK?
-
Hmmm... ich arbeite mit MVisual C++ 6.0...
kann sein das das ziemlich alt ist... wie gesagt, ich bin ein Anfänger mit Microsoft Programmierung. Ich habe nichts anderes zur Verfügung, ich darf auch das .Net framework nicht verwenden...könntest du mir vielleicht dein Code von der Create Session mit allen Inclusiven geben?
-
Kann ich nicht, ich habe Deinen Code genommen.

MVisual C++ 6.0 ist natürlich wirklich schon "ein wenig" veraltet, es gibt aber immer noch das Platform SDK zum Download (ich meine es ist "Windows Server 2003 Family"). Ich benutze VS 2008, konnte deinen Code aber auch mit VS 6 kompilieren und ausführen, natürlich mit dem letzten unterstützten P-SDK. Such aber einfach mal in deiner WinCon.h im include Verzeichnis.
Oh je, ich seh gerade, dass GetConsoleWindow nicht in der Datei wincon.h liegt, die damals mit VS 6 ausgeliefert wurde.
Das macht aber alles nichts
Ich habe gerade 0 als Parameter für HWND übergeben und der Programmablauf ist immer noch der Gleiche. Du solltest aber dennoch das P-SDK herunterladen oder auf VS 2008/2010 umsteigen.
-
Könntest du mir vielleicht das mit dem Definieren vom Callback nochmals erklären... ich bin Tod müde, möchte nachhause und wollte es eigentlich heute noch schaffen... naja
Wie muss ich den my_callback genau Definieren? habe wirklich ein Blackout im moment xD
-
// Fkt.- Prototyp SNMPAPI_STATUS CALLBACK My_Callback (IN HSNMP_SESSION hSession, IN HWND hWnd, IN UINT wMsg, IN WPARAM wParam, IN LPARAM lParam, IN LPVOID lpClientData); int main() { // .. } SNMPAPI_STATUS CALLBACK My_Callback (IN HSNMP_SESSION hSession, IN HWND hWnd, IN UINT wMsg, IN WPARAM wParam, IN LPARAM lParam, IN LPVOID lpClientData) { hier kommt der Code für My_Callback hin }Prototypen müssen natürlich nicht sein, du kannst selbstverständlich My_Callback auch komplett über main() schreiben, wie hier drunter geschehen. Wichtig ist nur, dass main() diese Funktion kennt (im Übrigen ist es genau das Gleiche wie bei der Verwendung von Header-Dateien).
SNMPAPI_STATUS CALLBACK My_Callback (IN HSNMP_SESSION hSession, IN HWND hWnd, IN UINT wMsg, IN WPARAM wParam, IN LPARAM lParam, IN LPVOID lpClientData) { return 0; // ein Wert } int main () { //FOR STARTUP unsigned long imajor = 2; unsigned long iminor = 2; unsigned long iversion = SNMPAPI_V2_SUPPORT; unsigned long itranslation = SNMPAPI_UNTRANSLATED_V2; unsigned long ion = SNMPAPI_ON; // unsigned long icallback = SNMPAPI_CALLBACK; //_______________________________________________ HANDLE hSession; if(SnmpStartup(&imajor,&iminor,&iversion,&itranslation,&ion) == SNMPAPI_SUCCESS) //Microsoft Snmp Implementation starten cout << "Started winSnmp Implementation" << endl; else cout << "failed to open winSNMP Implementation " << endl; hSession = SnmpCreateSession(GetConsoleWindow(),0,My_Callback,0); //FUNKTIONIERT NOCH NICHT if(SNMPAPI_FAILURE==hSession) cout << "SNMPAPI_FAILURE"<< endl; SnmpClose(hSession); if(SnmpCleanup() == SNMPAPI_SUCCESS) //Microsoft Snmp Implementation beenden cout << "Closed winSNMP Implementation" << endl; else cout << "failed to close winSNMP Implementation" << endl; system("pause"); return 1; }Es geht hier natürlich nur um die Initialisierung und die klappt bei mir.
Wie du siehst, habe ich deinen Code wirklich 1:1 übernommen.
Ausgabe:Started winSnmp Implementation Closed winSNMP Implementation Drücken Sie eine beliebige Taste . . .
-
Du bist der Hammer :p
Danke viel mal für deine Hilfe!! ich habe den Code "fast" zum laufen gebracht. Danke viel mal dafür! Fertig bin ich zwar noch nicht, aber der Grundstein ist gelegt.
Vielen Dank nochmals für deine Schnelle Hilfe!!!
lg
Cyrillc