The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"получить список доступных сетевых интерфейсов"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"получить список доступных сетевых интерфейсов" 
Сообщение от Natan Искать по авторуВ закладки on 27-Июн-05, 07:56  (MSK)
Здравствуйте.

Возникла задача получить список доступных интерфейсов в системе (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, в результате ничего не получаю.

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "получить список доступных сетевых интерфейсов" 
Сообщение от Alexander S. Salieff emailИскать по авторуВ закладки on 27-Июн-05, 18:34  (MSK)
>Здравствуйте.
>
>Возникла задача получить список доступных интерфейсов в системе (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;
}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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