Мне нужно получить дескриптор файла для использования в вызовах ioctl() для порта Ethernet в Linux. Не уверен, как это сделать.
получить дескриптор файла ioctl для порта Ethernet
Ответы (2)
Просто используйте файловый дескриптор открытого сокета, используя имя устройства в структуре ifreq
, переданной в ioctl()
, при условии, что ваша программа имеет для этого соответствующие разрешения.
Из документов:
Linux поддерживает некоторые стандартные ioctl для настройки сетевых устройств. Их можно использовать в любом файловом дескрипторе сокета, независимо от семейства или типа. Они передают структуру ifreq:
Сокет не обязательно должен быть привязан к целевому устройству или принадлежать к какому-либо определенному семейству. Подойдет любой открытый сокет fd (опять же, с соответствующими привилегиями), просто откройте его для конкретной задачи, подождите, пока ioctl()
вернется, и закройте его.
См. man 7 netdevice
для получения дополнительной информации или здесь, если у вас не установлены соответствующие пакеты документации. (подсказка, пакет обычно называется manpages-dev
или manpages-devel
, в зависимости от вашего дистрибутива)
Вы также можете взглянуть на исходный код пакета net-tools
, который может называться по-разному в зависимости от вашего дистрибутива. Это источник ifconfig
(Debian/Ubuntu здесь).
Извините за первоначальную двусмысленность, я думал, вы пытаетесь настроить специальное многофункциональное устройство (сейчас не знаю, почему, возможно, из-за недостатка сна).
Вы можете сделать что-то вроде этого fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)
Используйте strace
, чтобы увидеть, какие функции вызывает ifconfig.
ifreq
, переданной ядру через ioctl()
.
- person Tim Post♦; 15.06.2010
fd
должен быть допустимым дескриптором файла для открытого сокета. Это делается для того, чтобы ядро знало, что нужно передать ваш ioctl()
реализации сокета ioctl()
, а не какой-либо из множества других реализаций ioctl()
для других типов файлов.
- person caf; 16.06.2010