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 🙂


Anmelden zum Antworten