URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4959
[ Назад ]

Исходное сообщение
"получить список интерфейсов"

Отправлено Nim , 21-Дек-05 01:21 
Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без /proc =) ). Есть подозрение, что через ioctl.

Содержание

Сообщения в этом обсуждении
"получить список интерфейсов"
Отправлено horsh , 21-Дек-05 04:20 
>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/proc =) ). Есть подозрение, что через ioctl.

Вот тут можно посмотреть как это делает сам ifconfig:

http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...

например функция foreachinterface()


"получить список интерфейсов"
Отправлено Niam , 22-Дек-05 03:29 
>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>/proc =) ). Есть подозрение, что через ioctl.
>
>Вот тут можно посмотреть как это делает сам ifconfig:
>
>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
>
>например функция foreachinterface()

Это солярная версия, я бы зотел переносимую, или хотя бы под линуху. Пока буду рыть вокруг SIOCGIFCONF.


"получить список интерфейсов"
Отправлено Niam , 22-Дек-05 14:44 
>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>/proc =) ). Есть подозрение, что через ioctl.
>>
>>Вот тут можно посмотреть как это делает сам ifconfig:
>>
>>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
>>
>>например функция foreachinterface()
>
>Это солярная версия, я бы зотел переносимую, или хотя бы под линуху.
>Пока буду рыть вокруг SIOCGIFCONF.

Хе! Нашел. Оказывается проще не бывает =).
Есть готовая ф-ция, которая обворачивает рутинную работу с ioclt = struct if_nameindex *if_nameindex (void); А с ioctl тоже не ве гладко - вроде получилось получить список интерфейсов - но не полный =(.


"получить список интерфейсов"
Отправлено NikR , 10-Янв-06 04:12 
>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>/proc =) ). Есть подозрение, что через ioctl.
>>>
>>>Вот тут можно посмотреть как это делает сам ifconfig:
>>>
>>>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
>>>
>>>например функция foreachinterface()
>>
>>Это солярная версия, я бы зотел переносимую, или хотя бы под линуху.
>>Пока буду рыть вокруг SIOCGIFCONF.
>
>Хе! Нашел. Оказывается проще не бывает =).
>Есть готовая ф-ция, которая обворачивает рутинную работу с ioclt = struct if_nameindex
>*if_nameindex (void); А с ioctl тоже не ве гладко - вроде
>получилось получить список интерфейсов - но не полный =(.
>Я вот не догоняю как пользоваться if_nameindex, может поможите.


"получить список интерфейсов"
Отправлено Niam , 10-Янв-06 15:00 
>>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>>/proc =) ). Есть подозрение, что через ioctl.
>>>>
>>>>Вот тут можно посмотреть как это делает сам ifconfig:
>>>>
>>>>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
>>>>
>>>>например функция foreachinterface()
>>>
>>>Это солярная версия, я бы зотел переносимую, или хотя бы под линуху.
>>>Пока буду рыть вокруг SIOCGIFCONF.
>>
>>Хе! Нашел. Оказывается проще не бывает =).
>>Есть готовая ф-ция, которая обворачивает рутинную работу с ioclt = struct if_nameindex
>>*if_nameindex (void); А с ioctl тоже не ве гладко - вроде
>>получилось получить список интерфейсов - но не полный =(.
>>Я вот не догоняю как пользоваться if_nameindex, может поможите.

Я сделал это так:
    struct if_nameindex *ifaces = if_nameindex();
    if (ifaces == NULL)
        return __stringarray__;        
            
    register int i(-1);
    stringArr arr;
    
    while (ifaces[++i].if_index != 0)
        arr.push_back(ifaces[i].if_name);
    
    if_freenameindex(ifaces);


"получить список интерфейсов"
Отправлено NikR , 13-Янв-06 02:22 
>>>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>>>/proc =) ). Есть подозрение, что через ioctl.
>>>>>
>>>>>Вот тут можно посмотреть как это делает сам ifconfig:
>>>>>
>>>>>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
>>>>>
>>>>>например функция foreachinterface()
>>>>
>>>>Это солярная версия, я бы зотел переносимую, или хотя бы под линуху.
>>>>Пока буду рыть вокруг SIOCGIFCONF.
>>>
>>>Хе! Нашел. Оказывается проще не бывает =).
>>>Есть готовая ф-ция, которая обворачивает рутинную работу с ioclt = struct if_nameindex
>>>*if_nameindex (void); А с ioctl тоже не ве гладко - вроде
>>>получилось получить список интерфейсов - но не полный =(.
>>>Я вот не догоняю как пользоваться if_nameindex, может поможите.
>
>Я сделал это так:
> struct if_nameindex *ifaces = if_nameindex();
> if (ifaces == NULL)
>  return __stringarray__;
>
> register int i(-1);
> stringArr arr;
>
> while (ifaces[++i].if_index != 0)
>  arr.push_back(ifaces[i].if_name);
>
> if_freenameindex(ifaces);

>Да, у меня тоже не все.
   А что я должен получить таким образом.
  
    fd = Socket(AF_INET,SOCK_STREAM,0);
    list.sl_nmods =  Ioctl(fd, I_LIST,NULL);
    printf("%d modules\n", list.sl_nmods);
                
        (*void)list.sl_modlist = Calloc(nmods, sizeof(struct str_mlist));
    Ioctl(fd, I_LIST, &list);
Что за список.  У меня ршибка. list.sl_nmods=-1.  
  



"получить список интерфейсов"
Отправлено be , 18-Янв-06 09:14 
>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/proc =) ). Есть подозрение, что через ioctl.
ОС нужно указывать, относительно freebsd 4.10,4.11 (5.4 не проверено(?))

....
void
list_ifaces(arg)
    int arg[];
{
    arg[0] = CTL_NET;
    arg[1] = PF_ROUTE;
    arg[5] = arg[3] = arg[2] = 0;
    arg[4] = NET_RT_IFLIST;
}

int mib[6];
char *ptr, *nptr, *limit, *next;
size_t if_buf = 0, needed = 0;

....
list_ifaces(&mib);

if(sysctl(mib, 6, NULL, &if_buf, NULL, 0) < 0) {
      printf("sysctl() %s\n", strerror(errno));
      return EXIT_FAILURE;
}

next = ptr = malloc(if_buf);

if (sysctl(mib, 6, ptr, &if_buf, NULL, 0) < 0) {
      printf("sysctl() %s\n", strerror(errno));
      free(ptr);
      return EXIT_FAILURE;
}

limit = ptr + if_buf;

while(next < limit) {
     ifm = (struct if_msghdr *) next;
     if((ifm->ifm_flags & IFF_UP) && (ifm->ifm_flags | IFF_LOOPBACK)) {
           memset(if_name, 0, IFNAMSIZ);
           if_indextoname(ifm->ifm_index, (char *)&if_name);
#if RELEASE == 410
           sdl = (struct sockaddr_dl *)(ifm + 1);
#else
           sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) - sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
#endif
           printf("index:%s, mtu:%ld\n", if_name, ifm->ifm_data.ifi_mtu);
           printf("\tinput:%lu\n\toutput:%lu\n",ifm->ifm_data.ifi_ibytes,  ifm->ifm_data.ifi_obytes);
           printf("\t%s\n", ether_ntoa((struct ether_addr *)LLADDR(sdl)));
      }
           next += ifm->ifm_msglen;
           ifam = NULL;
           while(next < limit) {
                nextifm = (struct if_msghdr *)next;
                if (nextifm->ifm_type != RTM_NEWADDR)
                          break;
                if (ifam == NULL)
                          ifam = (struct ifa_msghdr *)nextifm;
                next += nextifm->ifm_msglen;
        }
}

free(ptr);
...