BroadCast Adressen unter linux
-
Hallo,
ich suche nach einer Moeglichkeit unterl linux die Broadcast-Netzwerk-Adressen von allen Interfaces rauszufinden.
Vielen Dank im voraus
-
Programmatisch? Im Shellskript? Nur zum lesen?
Für die letzten beiden einfach ifconfig laufen lassen, dort findest du unter Bcast: die Broadcastadressen.
-
So dass ich die Adressen in einem C/C++ programm weiter nutzen kann. Thanx
-
Schau dir mal /usr/include/linux/netdevice.h an. Dort kannst du über dev_get_by_name(...) die Informationen über das Interface beziehen. Die Broadcastadresse kann man dann über net_device->broadcast auslesen.
Ist ein Array übrigens, kein String.
-
[quote="ºgrimmsenº
"]Schau dir mal /usr/include/linux/netdevice.h an. Dort kannst du über dev_get_by_name(...) die Informationen über das Interface beziehen. Die Broadcastadresse kann man dann über net_device->broadcast auslesen.
Ist ein Array übrigens, kein String.[/quote]Ist vielversprechend. gcc sagt aber dass er dev_get_by_name nicht finden kann
-
Mist, is ja Kernel-Space! Ich schlage vor du schaust dir mal ifconfig an.
Du kannst den Code ja verwenden, dort in der Datei interface.c|h findest du die
richtig Funktionen if_fetch(). Ist was mit Syscalls, also sehr eklig!
http://www.tazenda.demon.co.uk/phil/net-tools/Viel Spass!
Wenn ich was habe poste ich es hier!
-
Thanx
ich habe mir auch etwas zusammengereimt:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <net/if.h>int main(int c, char **v)
{
struct ifreq ifa[10] = {0};
int fd;
struct ifconf conf;
conf.ifc_len = sizeof(ifa);
conf.ifc_ifcu.ifcu_req = ifa;char szName[IF_NAMESIZE+1] = {0};
if((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror ("socket");
exit (EXIT_FAILURE);
}if(ioctl(fd, SIOCGIFCONF, &conf)) {
perror ("ioctl");
exit (EXIT_FAILURE);
}for( int i = 0;i<sizeof(ifa)/sizeof(ifa[0]);++i)
switch(conf.ifc_ifcu.ifcu_req[i].ifr_addr.sa_family)
{
case AF_UNSPEC:
continue;
break;
case AF_INET:
printf("name = %s family = IP4\n", ifa[i].ifr_name);
int j;
for(j=2;j<6;++j)
printf("%d.", (unsigned char)ifa[i].ifr_addr.sa_data[j]);
printf("\b \n");
if(ioctl(fd, SIOCGIFBRDADDR, ifa +i))
{
perror ("ioctl");
exit (EXIT_FAILURE);
}
for(j=2;j<6;++j)
printf("%d.", (unsigned char)ifa[i].ifr_broadaddr.sa_data[j]);
printf("\b \n");
break;
default:
printf("name = %s. family = %d\n", ifa[i].ifr_name, ifa[i].ifr_addr.sa_family);
break;
}
return 0;
}Es tut was man braucht. Allergings halte ich es nicht fuer das Gelbe vom Ei.
-
Etwas kürzer _edit_
Deins ist natürlich sicherer, weil etwaige Fehler abgefangen werden.
#include <stdio.h> #include <net/if.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> int inet_sock; int main() { inet_sock=socket(AF_INET,SOCK_DGRAM,0); struct ifreq iface; strcpy(iface.ifr_name,"eth0"); ioctl(inet_sock,SIOCGIFBRDADDR,&iface); struct sockaddr_in* broadcast=(struct sockaddr_in*)&iface.ifr_broadaddr; printf("Broadcast: %d.%d.%d.%d", broadcast->sin_addr.s_addr&255, (broadcast->sin_addr.s_addr>>8)&255, (broadcast->sin_addr.s_addr>>16)&255, (broadcast->sin_addr.s_addr>>24)&255); return 0; }
-
Der Fehlerabfang ist nicht von mir
es ist "geklaut" worden.
Dein Program ist ubersichtlicher und kompakter.Danke schoen