Chcę znaleźć adres mac używając programu C w Linuksie. jak to zrobić?Jak uzyskać adres MAC interfejsu w systemie Linux przy użyciu programu C?
6
A
Odpowiedz
26
1 minuta poszukiwania throug google: (nie testowałem to sam, ja pracuję na komputerze z systemem Windows w tej chwili)
/*
* gethwaddr.c
*
* Demonstrates retrieving hardware address of adapter using ioctl()
*
* Author: Ben Menking <[email protected]>
*
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
int main(int argc, char *argv[])
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
for(s = 0; s < 6; s++)
{
printf("%.2X ", (unsigned char)buffer.ifr_hwaddr.sa_data[s]);
}
printf("\n");
return 0;
}
2
Istnieje ogromna biblioteka zarządzać ethernet. Jeśli chcesz przejść do rzeczy o niskim poziomie, na pewno warto się tego nauczyć. To dość trudne API C do nauki.
Lib PCAP.
Niektóre przykładowy kod:
#include <pcap.h>
#include <stdlib.h>
#include <netinet/ip.h>
#include <netinet/if_ether.h>
void find_eth_addr(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet) {
struct ether_header *eth_hdr = (struct ether_header *)packet;
if (ntohs(eth_hdr->ether_type) == ETHERTYPE_IP) {
struct ip *ip_hdr = (struct ip *)(packet + sizeof(struct ether_header));
if (ip_hdr->ip_dst.s_addr == search_ip->s_addr)
print_eth_addr(eth_hdr->ether_dhost);
if (ip_hdr->ip_src.s_addr == search_ip->s_addr)
print_eth_addr(eth_hdr->ether_shost);
}
}
Istnieje również ładne "funkcje jądra wrapper" jak biblioteki: DNET
który zapewnia dużą funkcjonalność, aby używać go na małej sieci poziomej . (również uzyskiwanie adresów MAC).
Istnieje UNIX porty & korzystna dla obu bibliotek.
Powiązane problemy
- 1. Uzyskaj adres IP interfejsu w systemie Linux
- 2. Jak uzyskać adres MAC interfejsu sieciowego WiFi?
- 3. Jak uzyskać statystyki karty sieciowej w systemie Linux/Mac OSX?
- 4. Jak uzyskać identyfikator procesu programu w systemie Unix lub Linux przy użyciu Pythona?
- 5. Jak używać Eclipse do debugowania programu C++ w systemie Linux?
- 6. Tworzenie pliku w systemie Linux przy użyciu C
- 7. Zmiana bieżącego katalogu w systemie Linux przy użyciu C++
- 8. Wykrywanie programu antywirusowego w systemie Windows przy użyciu C#
- 9. Jak uzyskać nazwę użytkownika w C/C++ w systemie Linux?
- 10. Tworzenie wirtualnego interfejsu sieciowego w systemie Linux?
- 11. Jak wysłać pakiet UDP z określonego interfejsu w systemie Linux?
- 12. Próbuję uzyskać adres MAC jako zmienną w systemie Linux, ale rzadko działa
- 13. Jak uzyskać stabilny adres MAC na PC?
- 14. Jak uzyskać adres MAC z Windows-mobile?
- 15. Uzyskaj adres mac w Javie przy użyciu getHardwareAddress niedeterministyczne
- 16. Uzyskaj adres MAC Ethernetu (nie interfejsu wifi)
- 17. Dzielenie pliku przy użyciu AWK w systemie Mac OS X
- 18. Jak zainstalować pakiet Android SDK w systemie Linux przy użyciu tylko interfejsu CLI?
- 19. błędy kompilacji przy użyciu signal.h w systemie Linux
- 20. monitorować wykorzystanie pamięci programu w systemie Linux
- 21. Jak uzyskać listę otwartych gniazd w systemie Linux za pomocą C?
- 22. Uzyskaj adres MAC z urządzeń przy użyciu Pythona
- 23. Uruchom inny program w systemie Linux z programu C++.
- 24. Tworzenie pliku Mac .app w systemie Windows przy użyciu Mono
- 25. Jak uzyskać adres IPv6 interfejsu pod Linuksem
- 26. HTTP POST i GET przy użyciu cURL w systemie Linux
- 27. C/C++ Linux MAC Address wszystkich interfejsów
- 28. Błędy kompilacji przy użyciu bfd.h w systemie Linux
- 29. Jak uzyskać podstawowy adres URL aplikacji MVC przy użyciu javascript
- 30. Jak odtwarzać w języku C++ przy użyciu interfejsu Windows API?
W każdym razie, aby uzyskać to bez kodowania "eth0" ?? –
Musisz przypisać kartę sieciową, w przeciwnym razie nie ma adresu mac, możesz to zrobić za pomocą wejścia lub jako argument, ale będziesz potrzebował adaptera. –
#include dla close() –
notlesh