Verwenden von C-Code, um dieselben Informationen wie ifconfig zu erhalten
Lesezeit: 6 Minuten
Gibt es unter Linux eine Möglichkeit, mit C-Code dieselben Informationen zu erhalten, die “ifconfig eth0” zurückgeben würde? Ich interessiere mich für Dinge wie IP-Adresse, Verbindungsstatus und MAC-Adresse.
Eine Möglichkeit, solchen Problemen auf den Grund zu gehen, insbesondere in Fällen, in denen Sie keine Quelle haben, ist spur.
Es gibt Ihnen eine Liste aller Systemaufrufe, die von jedem Programm, das Sie übergeben, durchgeführt wurden, zusammen mit ihren Argumenten und Rückgabewerten. Wenn Ihr Programm nur einige Informationen ausgibt und beendet wird, anstatt längere Zeit zu laufen, kann es ziemlich einfach sein, bei allen Systemaufrufen, die Sie sehen, einfach einen Mann zu machen, der so aussieht, als ob sie die gesuchten Informationen liefern könnten.
Wenn ich laufe
strace ifconfig
Einige der interessanten Anrufe sind:
open("/proc/net/dev", O_RDONLY) = 6
gefolgt von einer Reihe von ioctls, die die Antwort von @payne bestätigen:
+1 für eine Antwort, die zeigt, wie Sie die Antwort gefunden haben und wie Sie die Technik auf andere Probleme anwenden können
– R.. GitHub HÖR AUF, EIS ZU HELFEN
9. Februar 2011 um 23:48 Uhr
Clever ignoriert natürlich die Tatsache, dass für die Linuxifconfig Befehl, Quelle ist leicht verfügbar.
– mctylr
18. Juli 2014 um 16:56 Uhr
Dies muss eines der besten Tools sein, die ich je gesehen habe, um zu versuchen, die Funktionalität von Befehlen und Filtern zu emulieren. Manchmal sind Sie in Eile und müssen wissen, welche Abfolge von Systemaufrufen Ihnen das bringt, was Sie tun müssen, ohne popen() aufzurufen, um den Befehl zu berappen. Einer der besten Tipps, die ich zum Thema Linux-Programmierung gefunden habe. Vielen Dank!
@ppumkin: MAC[6] ein Ausgabeparameter ist, verwendet er ihn anstelle des Rückgabewerts. Geben Sie dort also einen Zeiger auf Ihr eigenes Array von unsigned chars ein. So was: unsigned char outMAC[6]; getMACAddress("eth0", outMac);
– Youda008
26. Dezember 2015 um 19:10 Uhr
Aber wie bekommt man den Schnittstellennamen, wenn man nur die Bindungsadresse hat?
– Carlo Holz
10. Juli 2019 um 15:38 Uhr
Mahdi Mohammadi
void parse_ioctl(const char *ifname)
{
printf("%s\n", "scarf rosari...");
int sock;
struct ifreq ifr;
struct sockaddr_in *ipaddr;
char address[INET_ADDRSTRLEN];
size_t ifnamelen;
/* copy ifname to ifr object */
ifnamelen = strlen(ifname);
if (ifnamelen >= sizeof(ifr.ifr_name)) {
printf("error :%s\n", ifr.ifr_name);
return ;
}
memcpy(ifr.ifr_name, ifname, ifnamelen);
ifr.ifr_name[ifnamelen] = '\0';
/* open socket */
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock < 0) {
printf("error :%s\n", "unable to open socket..");
return;
}
/* process mac */
if (ioctl(sock, SIOCGIFHWADDR, &ifr) != -1) {
printf("Mac address: %02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
}
/* process mtu */
if (ioctl(sock, SIOCGIFMTU, &ifr) != -1) {
printf("MTU: %d\n", ifr.ifr_mtu);
}
/* die if cannot get address */
if (ioctl(sock, SIOCGIFADDR, &ifr) == -1) {
close(sock);
return;
}
/* process ip */
ipaddr = (struct sockaddr_in *)&ifr.ifr_addr;
if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL) {
printf("Ip address: %s\n", address);
}
/* try to get broadcast */
if (ioctl(sock, SIOCGIFBRDADDR, &ifr) != -1) {
ipaddr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL) {
printf("Broadcast: %s\n", address);
}
}
/* try to get mask */
if (ioctl(sock, SIOCGIFNETMASK, &ifr) != -1) {
ipaddr = (struct sockaddr_in *)&ifr.ifr_netmask;
if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL) {
printf("Netmask: %s\n", address);
}
}
close(sock);
}
Verwendungszweck :
parse_ioctl("eth0");
Was übergebe ich an die unsigned char MAC[6] ??
– Piotr Kula
8. Juni 2015 um 21:22 Uhr
@ppumkin: MAC[6] ein Ausgabeparameter ist, verwendet er ihn anstelle des Rückgabewerts. Geben Sie dort also einen Zeiger auf Ihr eigenes Array von unsigned chars ein. So was: unsigned char outMAC[6]; getMACAddress("eth0", outMac);
– Youda008
26. Dezember 2015 um 19:10 Uhr
Aber wie bekommt man den Schnittstellennamen, wenn man nur die Bindungsadresse hat?
– Carlo Holz
10. Juli 2019 um 15:38 Uhr
13865000cookie-checkVerwenden von C-Code, um dieselben Informationen wie ifconfig zu erhaltenyes
‘ifconfig’ wird seit vielen Jahren nicht mehr unter Linux gepflegt. Verwenden Sie stattdessen „ip“. serverfault.com/questions/633087/…
– Mikemaccana
28. August 2015 um 14:55 Uhr