Почему макросы семейств протоколов и макросы семейств адресов дублируются

#linux #sockets

#linux #сокеты

Вопрос:

В битах / сокете.в системах Linux макросы семейств адресов определяются в терминах макросов семейств протоколов. между ними существует взаимно однозначное соответствие в виде

 #define AF_something PF_something
  

Поскольку сопоставление «один к одному» между макросами AF и PF-макросами кажется ненужным дублированием.

Мой вопрос: есть ли причина для этого?

Комментарии:

1. ИМХО, это ошибка. Оба набора констант выделяются IANA, и они случайно имеют такое отображение, но в IANA нет ничего, что оправдывало бы определение одного набора в терминах другого.

Ответ №1:

Первоначальная идея заключалась в том, чтобы сделать семейства адресов и протоколов независимыми. Адрес потенциально может использоваться в различных протоколах. Авторы ожидали, что, например, адрес IPv4 может использоваться другим гипотетическим протоколом, отличным от IP. И наоборот — независимые семейства готовы использовать новый вид адресов в протоколе IP.

Итак, единственная причина в том, что автор socket API хотел быть доказательством будущего. Насколько я знаю, между PF и AF все еще существует взаимно однозначное сопоставление.

Следовать первоначальной идее — хорошая привычка. Это означает иметь независимую константу и использовать константы PF при работе с протоколом, например, при создании socket: s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) и использовать константу AF, например, при работе с адресами sa.sin_family = AF_INET .