MacID Abfrage

Alles rund um die Programmierung mit Qt
Antworten
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

MacID Abfrage

Beitrag von FlorianBecker »

Hallo ich poste hier mal ein wenig Code, mit dem man die MacID unter Linux abfragt und auch unter Windows. Gut gehört eigentlich nicht hierher, aber mein anliegen.

Header:

Code: Alles auswählen

#ifndef _HOST_H_
#define _HOST_H_

/* qt header */
#include <qstring.h>

namespace PlaaSoft {
  /**
   * Die erste Netzwerkkarte unter Linux.
   *
   * @since 1.0
   */
  #define INPUT_IFACE_DEFAULT "eth0"

  /**
   * Host - Verschiedene Dienste eines Hostes.
   *
   * @class Host host.h "Host"
   * @ingroup AdminSDK
   * @author Florian Becker (PlaaSoft Technologies) <becker@plaasoft.de>
   * @date 2004/07/09
   * @version 1.0
   * @since 1.0
   */
  class Host {

  public:
    /**
     * Der Desktop Hostname.
     *
     * @return Den localen Hostnamen.
     * @since 1.0
     */
    static QString name();

    /**
     * Die Hardware Addresse, oder auch MAC Addresse genannt.
     *
     * @return Die locale MAC Addresse der ersten Netzwerkkarte.
     * @since 1.0
     */
    static QString addr();

  private:
    /**
     * Schreibe die Hardware addresse in einen QString.
     *
     * @param MACData   Die MAC Addresse.
     * @return Die geschriebene MAC Addresse.
     * @since 1.0
     */
    static QString address( unsigned char MACData[] );
  };
}

#endif
Linux:

Code: Alles auswählen

/* standard header */
#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>

/* local header */
#include <Host>

namespace PlaaSoft {

  static QString macid;

  QString Host::name() {

    char hostname[ 1024 ];
    gethostname( hostname, sizeof( hostname ) );
    return hostname;
  }

  QString Host::addr() {

    /* Ein sehr witziges Thema. Die MacID wird unter Linux nach mehrmaligem
    Abfragen durch eine andere beliebige ersetzt. Ist das ein Witz, oder dient
    es wirklich der Sicherheit? Das Problem tritt auf, wenn man ca. 120x ohne
    Pause anfragt, evtl. gibt es zu dem Thema eine Quelle, die die genauen
    Zeiten dafür weis. Vielleicht ist es aber auch nur ein Fehler */
    if ( !macid.isEmpty() )
      return macid;
    /* defeniere socket und interface */
    int isocket;
    struct ifreq iface;

    /* finde informationen zu eth0 */
    iface.ifr_addr.sa_family = AF_INET;
    strcpy( iface.ifr_name, INPUT_IFACE_DEFAULT );

    /* gehe auf den socket */
    isocket = socket( AF_INET, SOCK_DGRAM, 0 );

    /* schreibe mac id */
    ioctl( isocket, SIOCGIFHWADDR, &iface );
//     QString macid;
    macid.sprintf( "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
      iface.ifr_hwaddr.sa_data[0] & 0xff,
      iface.ifr_hwaddr.sa_data[1] & 0xff,
      iface.ifr_hwaddr.sa_data[2] & 0xff,
      iface.ifr_hwaddr.sa_data[3] & 0xff,
      iface.ifr_hwaddr.sa_data[4] & 0xff,
      iface.ifr_hwaddr.sa_data[5] & 0xff );

    return macid;
  }
}
Windows:

Code: Alles auswählen

/* windows header */
#include <windows.h>
#include <assert.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <tchar.h>
#include <winsock.h>

/* import windows lib */
#pragma comment(lib, "iphlpapi.lib")

/* local header */
#include <Host>

namespace PlaaSoft {

  QString Host::name() {

    char hostname[ 1024 ];
    gethostname( hostname, sizeof( hostname ) );
    return hostname;
  }

  QString Host::addr() {

    IP_ADAPTER_INFO AdapterInfo[ 16 ];
    DWORD dwBufLen = sizeof( AdapterInfo );

    DWORD dwStatus = GetAdaptersInfo( AdapterInfo, &dwBufLen );
    assert( dwStatus == ERROR_SUCCESS );

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
    return address( pAdapterInfo -> Address );
  }

  QString Host::address( unsigned char MACData[] ) {

    QString macid;
    return macid.sprintf( "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
      MACData[ 0 ],
      MACData[ 1 ],
      MACData[ 2 ],
      MACData[ 3 ],
      MACData[ 4 ],
      MACData[ 5 ] );
  }
}
Wenn ich die MacID nicht statisch definiere, sondern jedesmal neu abfrage, kommt nach dem ca 120x mal ohne timeout immer eine vom System vorgekaukelte. Ist das normal? Hat jmd. dazu eine Referenz, oder so?
heizer_2
Beiträge: 7
Registriert: 15. September 2008 19:51

Beitrag von heizer_2 »

Hallo Florian, lange her dieser Post.

Aber da ich heute nach einer (einfachen) Möglichkeit gesucht habe bin ich dein Bsp. Code mal durchgegangen.
Habe mit absicht mal die MAC 150x ausgelesen und tatsächlich ändert sich der Wert. (Bei meinem ARM Target erst nach ca. 400 mal lesen, aber es ändert sich auch dort)

Allerdings bleibt die MAC bei Aufruf von "ifconfig eth0" die selbe wie vorher.
Wenn ich zeit habe schau ich mal in den Treibern und den entsprechenden IOCTL aufrufen nach ob die Änderung beabsichtigt ist, oder es an was anderem liegt (was ich eher vermute).
Antworten