Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Snmp und Winapi? kennt sich da einer aus?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.09.2002, 17:40 Uhr
ulli



kennt sich einer mit SNMP unter Windows aus?
Ich häng da irgendwie total im Moment und kann absolut nicht einschätzen, wo das Prob liegt.
Jedenfalls liefert der "Codeschnipsel" nur Müll, egal, auf welchem Windowssystem, egal ob extra der SNMP-Dienst aktiviert wird, oder nicht.
Die Ausgabe ist zumindest immer dieselbe und von Computer zu Computer auch unterschiedlich.

Das ganze soll innerhalb eines größeren Programms laufen und ist zu Testzwecken "rausgeschnitten".

Ausgabe des Programms auf einen WinNT 4 System mit 1 "normale" Ethernetkarte und 1 FunkLan-Adapter:

C++:
# of adapters in this System: 50331652
Interface #1 type : 402653188
Interface #2 type : 100663300
Interface #3 type : 100663300

eigentlich müsste die Ausgabe sein:
# of adapters in this System: 2
Interface #1 type : 18
MAC Address of interface #1: [Mac]
Interface #2 type : 6
MAC Address of interface #2: [Mac]

Im Debugger melden alle Funktionen successful und die Errorwerte sind 0.

das Proggi:
#define NO_STRICT
#define _NO_VCL

#include <windows.h>
#include <snmp.h>
#include <conio.h>
#include <stdio.h>

typedef BOOL(WINAPI * pSnmpExtensionInit) (
        IN DWORD dwTimeZeroReference,
        OUT HANDLE * hPollForTrapEvent,
        OUT AsnObjectIdentifier * supportedView);

typedef BOOL(WINAPI * pSnmpExtensionTrap) (
        OUT AsnObjectIdentifier * enterprise,
        OUT AsnInteger * genericTrap,
        OUT AsnInteger * specificTrap,
        OUT AsnTimeticks * timeStamp,
        OUT RFC1157VarBindList * variableBindings);

typedef BOOL(WINAPI * pSnmpExtensionQuery) (
        IN BYTE requestType,
        IN OUT RFC1157VarBindList * variableBindings,
        OUT AsnInteger * errorStatus,
        OUT AsnInteger * errorIndex);

typedef BOOL(WINAPI * pSnmpExtensionInitEx) (
        OUT AsnObjectIdentifier * supportedView);

void main()
{
  HINSTANCE m_hInst;
  pSnmpExtensionInit m_Init;
  pSnmpExtensionInitEx m_InitEx;
  pSnmpExtensionQuery m_Query;
  pSnmpExtensionTrap m_Trap;
  HANDLE PollForTrapEvent;
  AsnObjectIdentifier SupportedView;
  UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};
  UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};
  UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};
  AsnObjectIdentifier MIB_ifMACEntAddr ={ sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr };
  AsnObjectIdentifier MIB_ifEntryType ={sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType};
  AsnObjectIdentifier MIB_ifEntryNum ={sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum};
  RFC1157VarBindList varBindList;
  RFC1157VarBind varBind[2];
  AsnInteger errorStatus;
  AsnInteger errorIndex;
  AsnObjectIdentifier MIB_NULL = {0, 0};
  int ret;
  int dtmp;
  int i = 0, j = 0;
  BOOL found = FALSE;
  char TempEthernet[13];
  m_Init = NULL;
  m_InitEx = NULL;
  m_Query = NULL;
  m_Trap = NULL;

  /* Load the SNMP dll and get the addresses of the functions
     necessary */

  m_hInst = LoadLibrary("inetmib1.dll");
  if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)
  {
    m_hInst = NULL;
    return;
  }
  m_Init =(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
  m_InitEx =(pSnmpExtensionInitEx) GetProcAddress(m_hInst,"SnmpExtensionInitEx");
  m_Query =(pSnmpExtensionQuery) GetProcAddress(m_hInst,"SnmpExtensionQuery");
  m_Trap =(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");

  m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);

  /* Initialize the variable list to be retrieved by m_Query */
  varBindList.list = varBind;
  varBind[0].name = MIB_NULL;
  varBind[1].name = MIB_NULL;

  /* Copy in the OID to find the number of entries in the
     Inteface table */

  varBindList.len = 1;        /* Only retrieving one item */
  SnmpUtilOidCpy(&varBind[0].name, &MIB_ifEntryNum);
  ret = m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,&errorIndex);
  printf("# of adapters in this system : %i\n",varBind[0].value.asnValue.number);

  varBindList.len = 2;
  /* Copy in the OID of ifType, the type of interface */
  SnmpUtilOidCpy(&varBind[0].name, &MIB_ifEntryType);

  /* Copy in the OID of ifPhysAddress, the address */
  SnmpUtilOidCpy(&varBind[1].name, &MIB_ifMACEntAddr);

  do
  {

    /* Submit the query.  Responses will be loaded into varBindList.
       We can expect this call to succeed a # of times corresponding
       to the # of adapters reported to be in the system */

    ret = m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
              &errorIndex);
    if (!ret)
      ret = 1;
    else
        /* Confirm that the proper type has been returned */
      ret = SnmpUtilOidNCmp(&varBind[0].name, &MIB_ifEntryType,
                       MIB_ifEntryType.idLength);
    if (!ret)
    {
        j++;
        dtmp = varBind[0].value.asnValue.number;
        printf("Interface #%i type : %i\n", j, dtmp);

        /* Type 6 describes ethernet interfaces */
        if(dtmp == 6)
        {

        /* Confirm that we have an address here */
        ret = SnmpUtilOidNCmp(&varBind[1].name, &MIB_ifMACEntAddr,MIB_ifMACEntAddr.idLength);
        if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))
        {
            if((varBind[1].value.asnValue.address.stream[0] == 0x44)
            && (varBind[1].value.asnValue.address.stream[1] == 0x45)
            && (varBind[1].value.asnValue.address.stream[2] == 0x53)
            && (varBind[1].value.asnValue.address.stream[3] == 0x54)
            && (varBind[1].value.asnValue.address.stream[4] == 0x00))
                {
                /* Ignore all dial-up networking adapters */
                printf("Interface #%i is a DUN adapter\n", j);
                continue;
                }
            if ((varBind[1].value.asnValue.address.stream[0] == 0x00)
            && (varBind[1].value.asnValue.address.stream[1] == 0x00)
            && (varBind[1].value.asnValue.address.stream[2] == 0x00)
            && (varBind[1].value.asnValue.address.stream[3] == 0x00)
            && (varBind[1].value.asnValue.address.stream[4] == 0x00)
            && (varBind[1].value.asnValue.address.stream[5] == 0x00))
                {
            /* Ignore NULL addresses returned by other network
                 interfaces */

                printf("Interface #%i is a NULL address\n", j);
                continue;
                }
        sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
                varBind[1].value.asnValue.address.stream[0],
                varBind[1].value.asnValue.address.stream[1],
                varBind[1].value.asnValue.address.stream[2],
                varBind[1].value.asnValue.address.stream[3],
                varBind[1].value.asnValue.address.stream[4],
                varBind[1].value.asnValue.address.stream[5]);
        printf("MAC Address of interface #%i: %s\n", j,
               TempEthernet);
        }
      }
    }
  } while (!ret);         /* Stop only on an error.  An error will occur
                             when we go exhaust the list of interfaces to
                             be examined */

  getch();

  FreeLibrary(m_hInst);
  SNMP_FreeVarBind(&varBind[0]);
  SNMP_FreeVarBind(&varBind[1]);
}



edit FloSoft: Codetags eingefügt

Dieser Post wurde am 17.09.2002 um 10:01 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.09.2002, 23:10 Uhr
ulli



sodele, hat sich erledigt.
Die snmp.h war verkehrt.
tz tz tz, wie kann man auch einfach Datentypen ändern und den Bezeichner gleich lassen. Na ja, jetzt läufts.
Nur irgendwie komisch, dass weder Compiler, noch Linker gemeckert hatten und selbst zur Laufzeit die Funktionen successful gemeldet hatten???
Na ja, jetzt funzt es zumindest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.09.2002, 19:15 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Zwischenfrage (aus Interesse): Mit was hast Du denn Compiliert?
So wie es auf der Borland Seite steht:
http://bdn.borland.com/article/0,1410,26040,00.html läuft's nicht mit jedem Compiler.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.09.2002, 08:10 Uhr
ulli




Zitat:
Uwe postete
Hallo,
Zwischenfrage (aus Interesse): Mit was hast Du denn Compiliert?
So wie es auf der Borland Seite steht:
http://bdn.borland.com/article/0,1410,26040,00.html läuft's nicht mit jedem Compiler.



Borland 5 -> funzt nicht
MS 6 -> funzt ohne Probs

Problem:
die snmp.h beider Systeme bestimmt teilweise unterschiedliche Datentypen in den Übergabestrukturen.
Ob das funzt, wenn die Borland snmp.h angepasst wird? Müsste eigentlich, hab ich aber nicht mehr probiert, weils jetzt läuft.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.09.2002, 19:11 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Ulli,

Zitat:
ulli postete
Borland 5 -> funzt nicht
[/i]

Eben darauf wollte ich hinaus, habe bis jetzt eigentlich immer nur Variante b genutzt.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.09.2002, 15:18 Uhr
ulli



der Quellcode unter: http://bdn.borland.com/article/0,1410,26040,00.html ist zudem fehlerhaft!
Dieser Post wurde am 19.09.2002 um 15:19 Uhr von ulli editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: