Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без /proc =) ). Есть подозрение, что через ioctl.
>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/proc =) ). Есть подозрение, что через ioctl.Вот тут можно посмотреть как это делает сам ifconfig:
http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
например функция foreachinterface()
>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>/proc =) ). Есть подозрение, что через ioctl.
>
>Вот тут можно посмотреть как это делает сам ifconfig:
>
>http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/cmd-in...
>
>например функция foreachinterface()Это солярная версия, я бы зотел переносимую, или хотя бы под линуху. Пока буду рыть вокруг SIOCGIFCONF.
>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>/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 тоже не ве гладко - вроде получилось получить список интерфейсов - но не полный =(.
>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>/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, может поможите.
>>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>>/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);
>>>>>>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>>>>>>/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.
>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/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);
...