LINUX.ORG.RU

Получить данные о сетевых интерфейсах на C


0

0

Через какие библиотченые функции/системные вызовы можно такое сделать? Задача банальная - узнать, есть ли в списке адресов машины искомый, только вот пока ничего некостыльного в голову не приходит =(

anonymous

> Задача банальная - узнать, есть ли в списке адресов машины искомый

создать сокет socket(PF_INET, SOCK_DGRAM, 0)

смотреть в сторону ioctl'ов с ним: SIOCGIFCONF

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> Задача банальная - узнать, есть ли в списке адресов машины искомый

если ничего больше не нужно, то наверно проще попытаться сделать bind на этот адрес и проверить код ошибки

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Спасибо за совет! Со вторым вопросов не возникает, поэтому я попробовал первый вариант =)
И сразу наткнулся на проблему. Вот код программы:

 15 int main() {
 16
 17     int sockfd, iores = 0;
 18     struct ifconf ifcnf;
 19
 20     memset(&ifcnf, '\0', sizeof(ifcnf));
 21     sockfd = socket(PF_INET, SOCK_DGRAM, 0);
 22
 23     iores = ioctl(sockfd, SIOCGIFCONF, &ifcnf);
 24
 25     return 0;
 26 }

А вот что показывает gdb:

(gdb) break test.c:22
Breakpoint 1 at 0x80483db: file test.c, line 22.
(gdb) run
Starting program: /home/me/sources/a.out

Breakpoint 1, main () at test.c:23
23              iores = ioctl(sockfd, SIOCGIFCONF, &ifcnf);
(gdb) display ifcnf
1: ifcnf = {ifc_len = 0, ifc_ifcu = {ifcu_buf = 0x0, ifcu_req = 0x0}}
(gdb) n
25              return 0;
1: ifcnf = {ifc_len = 64, ifc_ifcu = {ifcu_buf = 0x0, ifcu_req = 0x0}}
(gdb) display iores
2: iores = 0
(gdb)

Получается, что ioctl сработал без ошибок. Но все изменения, которые он сделал со структурой ifcnf - только изменил значение её поля ifc_len на 64. Что я делаю не так?

anonymous
()
Ответ на: комментарий от dilmah

Еще раз спасибо! То, что надо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.