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 0x0501
    

    vor 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


Anmelden zum Antworten