Упражнения

We use cookies. Read the Privacy and Cookie Policy

Упражнения

1. В разделе 17.7 мы сказали, что широковещательный адрес, возвращаемый запросом SIOCGIFBRDADDR, возвращается в элементе ifr_broadaddr. Но на с. 173 [128] сказано, что он возвращается в элементе ifr_dstaddr. Имеет ли это значение?

2. Измените программу get_ifi_info так, чтобы она делала первый вызов SIOCGIFCONF для одной структуры ifreq, а затем каждый раз в цикле увеличивайте длину на размер одной из этих структур. Затем поместите в цикл операторы, которые выводили бы размер буфера при каждом вызове независимо от того, возвращает функция ioctl ошибку или нет, и при успешном выполнении выведите возвращаемую длину буфера. Запустите программу prifinfo и посмотрите, как ваша система обрабатывает вызов, когда размер буфера слишком мал. Выведите также семейство адресов для всех возвращаемых структур, семейство адресов которых не совпадает с указанным в первом аргументе функции get_ifi_info, чтобы увидеть, какие еще структуры возвращает ваша система.

3. Измените функцию get_ifi_info так, чтобы она возвращала информацию об адресе с альтернативным именем, если дополнительный адрес находится не в той подсети, в которой находится предыдущий адрес для данного интерфейса. Таким образом, наша версия из раздела 17.6 будет игнорировать альтернативные имена в диапазоне от 206.62.226.44 до 206.62.226.46, и это вполне нормально, поскольку они находятся в той же подсети, что и первичный адрес интерфейса 206.62.226.33. Но если альтернативное имя находится в другой подсети, допустим 192.3.4.5, возвратите структуру ifi_info с информацией о дополнительном адресе.

4. Если ваша система поддерживает вызов SIOCGIGNUM функции ioctl, измените листинг 17.4 так, чтобы запустить этот вызов, и используйте возвращаемое значение как начальный размер буфера.

Данный текст является ознакомительным фрагментом.