LAN oder WLAN



  • Hallo C++ler,

    gibt es eine einfache Abfrage, ob ein Computer über LAN-Kabel oder WLAN online ist?

    Gruß AL



  • Hallo,

    guck dir mal die Dokumentation zur API-Funktion GetIfTable an! Die liefert eine Struktur, aus der sich die Art aller eingebauten NICs heraus schlüsseln lassen (dwType - http://msdn.microsoft.com/en-us/library/aa366836.aspx).
    Extrawünsche wirst du dir damit zusammen zimmern müssen (AFAIK).



  • Hmmm, danke erst mal. Bekomme ich gerade nicht recht hin, aber egal.

    Ich suche eigentlich nach einer eindeutigen Identifikation eines Computers. Ich habe hier gelesen, dass man die Mac-Adresse per Hand ändern kann.

    Gibt es irgendein Eindeutigkeitsmerkmal, was man leicht auslesen kann?



  • Hi,

    also die MAC Adresse sollte ja wohl die eindeutigste Identifikation darstellen.
    Einige wenige Karten lassen durchaus softwareseitig eine Änderung der Adresse zu.
    Das Universal-/Local-Bit bleibt davon aber unangetastet. (gibt an ob die Adresse global oder nur lokal gültig ist).
    Nur wie du das jetzt auslesen kannst, kann ich dir leider auch nicht sagen.



  • Hallo

    Diskussion über MAC-Adressen bitte in diesem Thread fortsetzen.
    Diskussion über WinAPI-Funktionen bitte im WinAPI-Forum fortsetzen.

    Der Builder hat weder etwas mit LAN/WLAN noch mit MAC-Adressen zu tun.

    bis bald
    akari



  • Ich habe eine kleine Funktion zum Auslesen der MAC-Adresse (der im Moment der Abfrage aktiven Karte) gefunden und sie ein wenig modifiziert. Nun habe ich durch Rumfummeln eine interessante Eigenschaft gefunden stAdapterStatus.adapt.adapter_type weiß aber nicht so recht, was die 3 stellige Zahl, die da zurückgegeben wird, bedeutet. Auf jeden Fall werden unterschiedliche Werte zurückggegeben, je nachdem ob WLAN oder LAN, aber auch nicht besonders reproduzierbar. Weiß jemand mehr zu der Eiegenschaft?

    AnsiString TForm1::GetMacAddresses(bool bMacAdr)
    {
    //---------------------------------------------------------------------------------------------------------------------
    //  Liest die MAC-Adresse des iTV-Clients aus
    //  Aber vorsicht, hat der iTV-Client mehrer Netzwerkkarten, ist das Ergebnis nicht mehr eindeutig
    //---------------------------------------------------------------------------------------------------------------------
    
    typedef struct _ASTAT
            {
            ADAPTER_STATUS  adapt;
            NAME_BUFFER  NameBuff[30];
            }
    ASTAT;
    
    int ilRetVal;       // Rückgabewert
    AnsiString slTyp = "";//Adapter-Typ
    AnsiString slMacAddress;//MAC-Adresse
    NCB stNetCtrlBlock;     // Network Control Block - Instanz
    LPVOID pASTAT;          // Zeiger auf die ASTAT-Struktur
    ASTAT stAdapterStatus;  // AdapterStatus-Struktur
    LANA_ENUM stLanEnum;    // Struktur für die Enumerierung der Netzwerkkarten
    
    // die Anzahl der Netzwerkkarten ermitteln:
    memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
    stNetCtrlBlock.ncb_command = NCBENUM;
    stNetCtrlBlock.ncb_buffer = (UCHAR *)&stLanEnum;
    stNetCtrlBlock.ncb_length = sizeof(stLanEnum);
    Netbios(&stNetCtrlBlock);
    ilRetVal = stLanEnum.length;
    
    // MAC-Adressen auslesen und in die Stringliste einfügen:
    for(int ilAdapter=0; ilAdapter < ilRetVal; ilAdapter++)
            {
            memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
            stNetCtrlBlock.ncb_command = NCBRESET;
            stNetCtrlBlock.ncb_lana_num = stLanEnum.lana[ilAdapter] ;
            Netbios(&stNetCtrlBlock);
            memset( &stNetCtrlBlock, 0, sizeof(stNetCtrlBlock) );
            stNetCtrlBlock.ncb_command = NCBASTAT;
            stNetCtrlBlock.ncb_lana_num = stLanEnum.lana[ilAdapter] ;
            strcpy(stNetCtrlBlock.ncb_callname,"*               ");
            stNetCtrlBlock.ncb_length = sizeof(stAdapterStatus);
            pASTAT=HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|
            HEAP_ZERO_MEMORY, stNetCtrlBlock.ncb_length);
    
            slTyp += stAdapterStatus.adapt.adapter_type;
    
            if(pASTAT != NULL)
                    {
                    stNetCtrlBlock.ncb_buffer=(UCHAR *)pASTAT;
                    Netbios(&stNetCtrlBlock);
                    CopyMemory(&stAdapterStatus,stNetCtrlBlock.ncb_buffer,
                    sizeof(stAdapterStatus));
                    for(int i =0; i < 6; i++)
                            {
                            slMacAddress +=IntToHex(stAdapterStatus.adapt.adapter_address[i],2);
                            if(i<5) slMacAddress+=":";
                            }
                    HeapFree(GetProcessHeap(),0,pASTAT);
                    }
            else ilRetVal = 0;
            }
    if(bMacAdr==true)return slMacAddress;
    else return slTyp;
    }
    

Anmelden zum Antworten