MAC-Adresse eines Devices in einer C-Konsolenanwendung mit bekannter IP herausfinden



  • Hallo,

    wie der Titel schon sagt, möchte ich die MAC-Adresse einer Hardware im Netzwerk herausfinden. Dies möchte ich aber nicht einfach im cmd machen, sondern ich benötige die MAC für den weiteren Programmablauf.

    Allgemein geht es um eine kleine Serie von Geräten die ich laufend konfigurieren muss. Dabei ist die IP bekannt und für die Konfiguration wird zusätzlich die MAC benötigt. Diese ist zwar auch bekannt, allerdings möchte ich nicht bei jedem Durchlauf die MAC von Hand eintippen.

    Mein Gedanke:
    - TCP-Verbindung über Socket aufbauen, MAC-Adresse auslesen und in Variable speichern, TCP-Verbindung beenden und dann die eigentliche Konfiguration im Programm abarbeiten.

    Mein Problem:
    Ich finde nirgends Informationen wie ich bei einem C-Socket die MAC-Adresse der Gegenstelle herausfinden kann. Das muss aber doch irgendwie möglich sein? Oder geht das nur über die ARP-Tabelle? Wenn ja wie komm ich da an meine MAC im C-Programm?

    Aktuell schaut meine *.c oben so aus, allerdings konnte ich bei WinSock2 nicht herausfinden wie ich an die MAC-Adresse komme. Socket anhand der IP aufbauen und alles ist kein Problem und funktioniert auch wunderbar.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <WinSock2.h>  // header file for winsocket functions
    
    #pragma comment(lib, "ws2_32.lib") //Winsock Library file linked
    
    /*
    
    struct sockaddr_in{
    	short			sin_family; //AF_INET, AF_INET6
    	unsigned short	sin_port;	//
    	struct in_addr	sin_addr;	// see struct in_addr, below
    	char			sin_zero[8] //
    };
    
    typedef struct in_addr {
    	union{
    		struct{
    			u_char s_b1, s_b2, s_b3, s_b4;
    		} S_un_w;
    		u_long S_addr;
    	} S_un;
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
    
    struct sockaddr{
    	unsigned short sa_family;	// address famil (AF_INET or AF_INET6)
    	char		   sa_data[14]; // 14 bytes of protocol address
    };
    
    */
    

    EDIT: Beitrag aus dem C-Forum "verschoben"



  • TGlaeser schrieb:

    Aktuell schaut meine *.c oben so aus, allerdings konnte ich bei WinSock2 nicht herausfinden wie ich an die MAC-Adresse komme. Socket anhand der IP aufbauen und alles ist kein Problem und funktioniert auch wunderbar.

    die mac-adresse ist dann auch schon weg. bei sockets geht es um ip&port.
    da du die ip-adresse kennst, schickst du einfach einen arp request, und in der antwort bekommst du, was du suchst.



  • Wie kann ich diesen ARP-Request in C denn einfach realisieren, wenn ich die IP habe? Über CMD ist das ja kein Problem, aber im laufenden Programm?



  • TGlaeser schrieb:

    Wie kann ich diesen ARP-Request in C denn einfach realisieren, wenn ich die IP habe? Über CMD ist das ja kein Problem, aber im laufenden Programm?

    Okay, das Thema hat sich erledigt 🙂
    Danke arpi für den Hinweis!

    Ist noch arg unsauber programmiert, aber als erster Test hat es sofort funktioniert:

    FILE *Stream;
    		char Inhalt_Text[1000];
    		char tmp[1000];
    		char *ARP_MAC_Adresse;
    		strcpy(MAC_Adresse, "0080A393____");
    		strcpy(message, "arp -a ");
    		strcat(message, IP);
    		if ((Stream = _popen(message, "r")) == NULL){
    			printf("ARP Fehlgeschlagen!\n\n");
    		}
    		while (fgets(Inhalt_Text, 1000, Stream)){
    			if ((ARP_MAC_Adresse = strstr(Inhalt_Text, "00-80-a3-93-")) != NULL){
    				printf("\n\n\n%c%c:%c%c\n\n\n", ARP_MAC_Adresse[12], ARP_MAC_Adresse[13], ARP_MAC_Adresse[15], ARP_MAC_Adresse[16]);
    				int j = 0;
    				for (int i = 8; i <= 11; i++){
    					switch (i){
    					case 8:
    						j = 12;
    						break;
    					case 9:
    						j = 13;
    						break;
    					case 10:
    						j = 15;
    						break;
    					case 11:
    						j = 16;
    						break;
    					default:
    						break;
    					}
    					if ((ARP_MAC_Adresse[j] >= 0x30) && (ARP_MAC_Adresse[j] <= 0x39)){
    						MAC_Adresse[i] = ARP_MAC_Adresse[j];		// als Zahl speichern
    					}
    					else if ((ARP_MAC_Adresse[j] >= 0x41) && (ARP_MAC_Adresse[j] <= 0x46)){
    						MAC_Adresse[i] = ARP_MAC_Adresse[j];		// als Großbuchstabe speichern
    					}
    					else if ((ARP_MAC_Adresse[j] >= 0x61) && (ARP_MAC_Adresse[j] <= 0x66)){
    						MAC_Adresse[i] = ARP_MAC_Adresse[j] - 0x20;		// in Großbuchstabe umwandeln
    					}
    					else{
    						printf("ARP-Umwandlung Fehlgeschlagen!\n\n");
    					}
    				}
    				break;
    			}
    		}
    		_pclose(Stream);
    		printf("\n\n\n%c%c:%c%c:%c%c:%c%c:%c%c:%c%c\n\n\n", MAC_Adresse[0], MAC_Adresse[1], MAC_Adresse[2], MAC_Adresse[3], MAC_Adresse[4], MAC_Adresse[5], MAC_Adresse[6], MAC_Adresse[7], MAC_Adresse[8], MAC_Adresse[9], MAC_Adresse[10], MAC_Adresse[11]);
    

    -- Closed! -- 😃



  • TGlaeser schrieb:

    Danke arpi für den Hinweis!

    freut mich, dass ich helfen konnte. 🙂


Anmelden zum Antworten