#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
.