2010-06-15 2 views

ответ

3

Просто используйте дескриптор файла открытого сокета, используя имя устройства в структуре ifreq, переданное в ioctl(), при условии, что ваша программа имеет соответствующие разрешения для этого.

Из документов:

Linux поддерживает некоторые стандартные IOCTLs для настройки сетевых устройств. Они могут использовать в любом файле сокета дескриптор независимо от семейства или типа. Они передают структуру ifreq:

Сокет не обязательно должен быть привязан к целевому устройству или иметь какое-либо конкретное семейство. Любой открытый сокет fd будет делать (опять же, с соответствующими правами), просто откройте его для своей конкретной задачи, подождите ioctl(), чтобы вернуть его и закрыть.

См man 7 netdevice для более или here, если у вас нет соответствующей документации установленных пакетов (подсказка, пакет обычно называется manpages-dev или manpages-devel, в зависимости от вашего дистрибутива)

Вы также можете посмотреть на источник для пакета net-tools, который может быть назван по-разному в зависимости от вашего дистрибутива. Это источник для ifconfig (Debian/Ubuntu здесь).

Извините за оригинальную двусмысленность, я думал, что вы пытаетесь настроить специальное многофункциональное устройство (не знаете, почему сейчас, возможно, не хватает сна).

+0

Извините, не знаю, где будет выглядеть файл, который я собираюсь открыть. Просто подумал, что использование ioctl было бы проще, чем анализ ifconfig. – Terminal

+0

@ Терминал - отредактировал мой ответ для ясности. –

+0

@ Терминал - И вообще, да, это .. в зависимости от того, что вы делаете. –

1

Вы можете сделать что-то вроде этого fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)

Используйте strace, чтобы увидеть, какие функции Ifconfig вызовов.

+0

Эта особенность ioctl() не заботится о семействе или даже если сокет связан с рассматриваемым интерфейсом. –

+0

Вы правы, но этот вызов используется ifconfig eth0 , чтобы настроить IP-адрес на eth0. –

+0

Я думаю, вы имели в виду «какие функции ** ifconfig ** calls»? Тем не менее, независимо от того, любой открытый сокет будет работать. «Магия» указана по адресу инициализированной структуры 'ifreq', переданной ядру через' ioctl() '. –

Смежные вопросы