Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

118 memcpy(ifi->ifi_dstaddr, sinptr, sizeof(struct sockaddr_in));

119 }

120 #endif

121 break;

122 case AF_INET6:

123 sin6ptr = (struct sockaddr_in6*)&ifr->ifr_addr;

124 ifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in6));

125 memcpy(ifi->ifi_addr, sin6ptr, sizeof(struct sockaddr_in6));

126 #ifdef SIOCGIFDSTADDR

127 if (flags & IFF_POINTOPOINT) {

128 Ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);

129 sin6ptr = (struct sockaddr_in6*)&ifrcopy.ifr_dstaddf;

130 ifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in6));

131 memcpy(ifi->ifi_dstaddr, sin6ptr,

132 sizeof(struct sockaddr_in6));

133 }

134 #endif

135 break;

136 default:

137 break;

138 }

139 }

140 free(buf);

141 return(ifihead); /* указатель на первую структуру в связной списке */

142 }

102-104
Мы копируем IP-адрес, возвращенный из нашего начального вызова
SIOCGIFCONF
функции
ioctl
, в структуру, которую мы создаем.

106-119
Если интерфейс поддерживает широковещательную передачу, мы получаем широковещательный адрес с помощью вызова
SIOCGIFBRDADDR
функции
ioctl
. Мы выделяем память для структуры адреса сокета, содержащей этот адрес, и добавляем ее к структуре
ifi_info
, которую мы создаем. Аналогично, если интерфейс является интерфейсом типа «точка-точка», вызов
SIOCGIFBRDADDR
возвращает IP-адрес другого конца связи.

123-133
Обработка случая IPv6 — полная аналогия IPv4 за тем исключением, что вызов
SIOCGIFBRDADDR
не делается, потому что IPv6 не поддерживает широковещательную передачу.

В листинге 17.8 показана функция

free_ifi_info
, которой передается указатель, возвращенный функцией
get_ifi_info
. Эта функция освобождает всю динамически выделенную память.

Листинг 17.8. Функция free_ifi_info: освобождение памяти, которая была динамически выделена функцией get_ifi_info

//iосtl/get_ifi_info.c

143 void

144 free_ifi_info(struct ifi_info *ifihead)

145 {

146 struct ifi_info *ifi, *ifinext;

147 for (ifi = ifihead; ifi != NULL; ifi = ifinext) {

148 if (ifi->ifi_addr != NULL)

149 free(ifi->ifi_addr);

150 if (ifi->ifi_brdaddr != NULL)

151 free(ifi->ifi_brdaddr);

152 if (ifi->ifi_dstaddr != NULL)

153 free(ifi->ifi_dstaddr);

154 ifinext = ifi->ifi_next; /* невозможно получить ifi_next

после вызова freed */

155 free(ifi);

156 }

157 }

17.7. Операции с интерфейсами

Как мы показали в предыдущем разделе, запрос

SIOCGIFCONF
возвращает имя и структуру адреса сокета для каждого сконфигурированного интерфейса. Существует множество других вызовов, позволяющих установить или получить все остальные характеристики интерфейса. Версия
get
этих вызовов (
SIOCGxxx
) часто запускается программой
netstat
, а версия
set
(
SIOCSxxx
) — программой
ifconfig
. Любой пользователь может получить информацию об интерфейсе, в то время как установка этой информации требует прав привилегированного пользователя.

  • Читать дальше
  • 1
  • ...
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: