Шрифт:
На маршрутизирующем сокете происходит обмен пятью различными структурами, как показано в последнем столбце таблицы:
rt_msghdr
, if_msghdr
, if_announcemsghdr
, ifma_msghdr
и ifa_msghdr
. Эти структуры представлены в листинге 18.2. Листинг 18.2.Пять структур, возвращаемых с маршрутизирующими сообщениями
struct rt_msghdr { /* из <net/route.h> */
u_short rtm_msglen; /* для пропуска некорректных сообщений */
u_char rtm_version; /* для обеспечения двоичной совместимости в будущем */
u_char rtm_type; /* тип сообщения */
u_short rtm_index; /* индекс интерфейса, с которым связан адрес */
int rtm_flags; /* флаги */
int rtm_addrs; /* битовая маска, идентифицирующая sockaddr (структуру адреса
сокета) в msg */
pid_t rtm_pid; /* идентификация отправителя */
int rtm_seq; /* для идентификации действия отправителем */
int rtm_errno; /* причина неудачного выполнения */
int rtm_use; /* из rtentry */
u_long rtm_inits; /* какую метрику мы инициализируем */
struct rt_metrics rtm_rmx; /* сами метрики */
};
struct if_msghdr { /* из <net/if.h> */
u_short ifm_msglen; /* для пропуска некорректных сообщений */
u_char ifm_version; /* для обеспечения двоичной совместимости в будущем */
u_char ifm_type; /* тип сообщения */
int ifm_addrs; /* как rtm_addrs */
int ifm_flags; /* значение if_flags */
u_short ifm_index; /* индекс интерфейса, с которым связан адрес */
struct if_data ifm_data; /* статистические и другие сведения */
};
struct ifa_msghdr { /* из <net/if.h> */
u_short ifam_msglen; /* для пропуска некорректных сообщений */
u_char ifam_version; /* для обеспечения двоичной совместимости в будущем */
u_char ifam_type; /* тип сообщения */
int ifam_addrs; /* как rtm_addrs */
int ifam_flags; /* значение ifa_flags */
u_short ifam_index; /* индекс интерфейса, с которым связан адрес */
int ifam_metric; /* значение ifa_metric */
};
struct ifma_msghdr { /* из <net/if.h> */
u_short ifmam_msglen; /* для пропуска некорректных сообщений */