Как получить сетевую маску?

Я знаю, как получить из ifconfig. (Linux) Но есть ли другой способ? Можете найти его в розетке.

1 ответ

Решение

Вам нужно использовать IO#ioctl. Это абсолютно непереносимо. На моей коробке Linux это кодовые слова:

require 'socket'
sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM,0)
buf = ["eth0",""].pack('a16h16')
sock.ioctl(0x891b, buf)
netmask = "#{buf[20]}.#{buf[21]}.#{buf[22]}.#{buf[23]}" #=> "255.255.255.240"

Ioctl значительно отличается в разных системах, и мне пришлось просмотреть несколько системных заголовочных файлов, чтобы получить правильные размеры для [].pack, расположение адреса в buf и числовое значение для SIOCGIFBRDADDR (первый аргумент для ioctl).

Если эти значения не работают для вас, я могу дать вам больше информации о том, как их найти.

Другие вопросы по тегам