The OpenNET Project / Index page

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

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

"получить список интерфейсов" 
Сообщение от Nim Искать по авторуВ закладки(??) on 21-Дек-05, 01:21  (MSK)
Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без /proc =) ). Есть подозрение, что через ioctl.
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

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

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

http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c

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

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

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

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

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

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

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

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

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

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

5. "получить список интерфейсов" 
Сообщение от Niam Искать по авторуВ закладки on 10-Янв-06, 15:00  (MSK)
>>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>>/proc =) ). Есть подозрение, что через ioctl.
>>>>
>>>>Вот тут можно посмотреть как это делает сам ifconfig:
>>>>
>>>>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
>>>>
>>>>например функция 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);

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

6. "получить список интерфейсов" 
Сообщение от NikR Искать по авторуВ закладки(ok) on 13-Янв-06, 02:22  (MSK)
>>>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>>>/proc =) ). Есть подозрение, что через ioctl.
>>>>>
>>>>>Вот тут можно посмотреть как это делает сам ifconfig:
>>>>>
>>>>>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
>>>>>
>>>>>например функция 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.  
  


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

8. "получить список интерфейсов" 
Сообщение от be emailИскать по авторуВ закладки on 18-Янв-06, 09:14  (MSK)
>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/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);
...

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


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

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




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Ihor
Хостинг:

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