The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
получить список доступных сетевых интерфейсов, !*! Natan, 27-Июн-05, 07:56  [смотреть все]
Здравствуйте.

Возникла задача получить список доступных интерфейсов в системе (linux. ядро 2.4.20). Вот кусочек кода:

int sd;
struct ifconf ifc;

if ( (sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
   perror("socket() error!");
   exit(1);
}

memset(&ifc, 0, sizeof ifc);

ioctl(sd, SIOCGIFCONF, &ifc);

close(sd);
...

Структура ifconf содержит указатель на массив структур ifreq, которая в свою очередь содержит поле  ifr_name (то есть имя интерфейса).
Но отлаживая в GDB вижу что указатель на ifreq NULL, в результате ничего не получаю.

В чем проблема?
Спасибо.

  • получить список доступных сетевых интерфейсов, !*! Alexander S. Salieff, 18:34 , 27-Июн-05 (1)
    >Здравствуйте.
    >
    >Возникла задача получить список доступных интерфейсов в системе (linux. ядро 2.4.20). Вот
    >кусочек кода:
    >
    >int sd;
    >struct ifconf ifc;
    >
    >if ( (sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
    >   perror("socket() error!");
    >   exit(1);
    >}
    >
    >memset(&ifc, 0, sizeof ifc);
    >
    >ioctl(sd, SIOCGIFCONF, &ifc);
    >
    >close(sd);
    >...
    >
    >Структура ifconf содержит указатель на массив структур ifreq, которая в свою очередь
    >содержит поле  ifr_name (то есть имя интерфейса).
    >Но отлаживая в GDB вижу что указатель на ifreq NULL, в результате
    >ничего не получаю.
    >
    >В чем проблема?
    >Спасибо.

    Короче делал я в свое время демку, которая вытаскивает всю инфу по интерфейсам, она точно пашет, смотри, юзай.

    #undef KERNEL
    #include <sys/param.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <net/route.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>

    #include <unistd.h>
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>

    #define MAX_NUM_IFREQ (512)

    extern  int errno;

    int
    main(argc, argv)
        int argc; char **argv;
    {
        struct ifconf       Ifc;
        struct ifreq        IfcBuf[MAX_NUM_IFREQ];
        struct ifreq        *pIfr;
        int num_ifreq;
        int i;
        int fd;
        struct sockaddr_in addrtmp;
        unsigned char mac[10]={0};

        Ifc.ifc_len = sizeof(IfcBuf);
        Ifc.ifc_buf = (char *) IfcBuf;

        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
            perror("\nshowme::socket(): ");
            fflush(stderr);
            return 0;
        }

        if ( ioctl(fd, SIOCGIFCONF, &Ifc) < 0) {
            perror("\nshowme::ioctl SIOCGIFCONF: ");
            fflush(stderr);
            close(fd);
            return 0;
        }
        num_ifreq = Ifc.ifc_len / sizeof(struct ifreq);
        for ( pIfr = Ifc.ifc_req, i = 0 ; i < num_ifreq; pIfr++, i++ ) {
            printf("---===<<<[%d]>>>===---\n", i);
            if (pIfr->ifr_addr.sa_family != AF_INET)
             printf("\n[%d] Is not AF_INET interface! Next information may be incorrect...\n", i);
            printf("\n[%d] Name = %s\n", i, pIfr->ifr_name);

            if ( ioctl(fd,SIOCGIFHWADDR, pIfr) < 0)
              {
              perror("\nshowme::Skip ioctl SIOCGIFHWADDR, error: ");
              fflush(stderr);
              }
            else
              {
              memcpy(mac,(unsigned char *)&(pIfr->ifr_hwaddr.sa_data),sizeof(struct sockaddr));
              printf("\n[%d] MAC = %02X:%02X:%02X:%02X:%02X:%02X\n",
              i,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
              }

            if ( ioctl(fd, SIOCGIFADDR, pIfr) < 0)
              {
              perror("\nshowme::Skip ioctl SIOCGIFADDR, error: ");
              fflush(stderr);
              }
            else
              {
              memcpy(&addrtmp,&(pIfr->ifr_addr),sizeof(addrtmp));
              printf("\n[%d] Address = %s\n",i, inet_ntoa(addrtmp.sin_addr));
              }

            if ( ioctl(fd, SIOCGIFBRDADDR, pIfr) < 0)
              {
              perror("\nshowme::Skip ioctl SIOCGIFBRDADDR, error: ");
              fflush(stderr);
              }
            else
              {
              memcpy(&addrtmp,&(pIfr->ifr_broadaddr),sizeof(addrtmp));
              printf("\n[%d] BroadAddress = %s\n",i, inet_ntoa(addrtmp.sin_addr));
              }

            if ( ioctl(fd, SIOCGIFNETMASK, pIfr) < 0)
              {
              perror("\nshowme::Skip ioctl SIOCGIFNETMASK, error: ");
              fflush(stderr);
              }
            else
              {
              memcpy(&addrtmp,&(pIfr->ifr_addr),sizeof(addrtmp));
              printf("\n[%d] MaskAddress = %s\n",i, inet_ntoa(addrtmp.sin_addr));
              }

            if ( ioctl(fd, SIOCGIFFLAGS, pIfr) < 0)
              {
              perror("\nshowme::Skip ioctl SIOCGIFFLAGS, error: ");
              fflush(stderr);
              }
            else
              {
              printf("\n[%d] IFF_UP=%s\n",i, pIfr->ifr_flags&0x1?"ON":"OFF");
              printf("\n[%d] IFF_BROADCAST=%s\n",i, pIfr->ifr_flags&0x2?"ON":"OFF");
              printf("\n[%d] IFF_DEBUG=%s\n",i, pIfr->ifr_flags&0x4?"ON":"OFF");
              printf("\n[%d] IFF_LOOPBACK=%s\n",i, pIfr->ifr_flags&0x8?"ON":"OFF");
              printf("\n[%d] IFF_P2P=%s\n",i, pIfr->ifr_flags&0x10?"ON":"OFF");
              printf("\n[%d] IFF_NOTRAILERS=%s\n",i, pIfr->ifr_flags&0x20?"ON":"OFF");
              printf("\n[%d] IFF_RUNNING=%s\n",i, pIfr->ifr_flags&0x40?"ON":"OFF");
              printf("\n[%d] IFF_NOARP=%s\n",i, pIfr->ifr_flags&0x80?"ON":"OFF");
              }
        }
    fflush(stdout);
    close(fd);
    return 0;
    }




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру