Mac + Ruby: не удается получить доступ к ioctl Socket? Как исправить?

Доброе время суток.

Рубиновый код:

def hw_address(iface)
    sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM,0)

    buf = [iface,""].pack('a16h16')
    sock.ioctl(SIOCGIFHWADDR, buf);

    sock.close

    return buf[18..24].to_etheraddr
end

puts hw_address('lo0')

Что делает: получает mac-адрес интерфейса.

Работает в Debian, как и ожидалось. Но в Mac OS X я получаю сообщение об ошибке: ``ioctl': операция не поддерживается для сокета (Errno::EOPNOTSUPP)`

Можно ли как-то исправить/пропустить это сообщение об ошибке и начать работать ioctl на сокетах?


person Bubonic Pestilence    schedule 02.11.2009    source источник
comment
Откуда вы берете определение SIOCGIFHWADDR? На моем Mac это, похоже, не определено даже в системных заголовочных файлах - в sockio.h есть SIOCGLIFADDR, который, кажется, делает то же самое (но я не знаю, как получить к нему доступ из ruby).   -  person SteveRawlinson    schedule 22.10.2010
comment
Спасибо, взял из исходников freebsd.   -  person Bubonic Pestilence    schedule 24.10.2010


Ответы (1)


http://hintsforums.macworld.com/showthread.php?t=97909

«Следующие функции недоступны в Mac OS X:

1) Библиотека таймеров POSIX (-librt Real Time) 2) ioctl с командой SIOCGIFHWADDR — для получения Mac-адреса сетевого интерфейса.

Такова жизнь.

person Mike Jr    schedule 28.11.2011
comment
Спасибо за 2 года + 26 дней ответа :) - person Bubonic Pestilence; 16.01.2012
comment
Просматривая это даже позже, насколько я помню, у меня был тот же вопрос, я нашел ответ и вернулся, чтобы задокументировать его. - person Mike Jr; 04.12.2012