Ноль обычно подходит для протокола?

#c #gnu

#c #gnu

Вопрос:

Я просматривал руководство GNU, libc по использованию сокетов. Согласно документации здесь

Точная формулировка из документации,

ноль обычно подходит для протокола.

Я видел несколько примеров кода, в которых инженеры ставили 0 для протокола при реализации сокета независимо от используемого протокола!

  int socket (int namespace, int style, int protocol)
 

Могу ли я узнать, что автор подразумевает под приведенным выше утверждением? Я мог чувствовать, что существуют ситуации, в которых 0 может быть неправильным ответом в соответствии с утверждением автора, если да, возможно ли, чтобы кто-нибудь подробно остановился на таких сценариях? Самое главное, где мы получаем значение для протокола? Существует ли какой-либо стандарт для обозначения номеров протоколов?

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

1.«Указание протокола, равного 0, заставляет socket() использовать неуказанный протокол по умолчанию, соответствующий запрошенному типу сокета». src

2. Ответ на ваш вопрос можно получить, объединив заявление @JohnnyMopp с информацией, содержащейся здесь : «Обычно существует только один протокол для поддержки определенного типа сокета в пределах данного семейства протоколов, и в этом случае протокол может быть указан как 0. Однако возможно, что может существовать много протоколов, и в этом случае конкретный протокол должен быть указан таким образом «. Поскольку наиболее релевантной информацией является предыдущая, имеет ли они право написать ответ из этого.

3. Подводя итог, в случае protocol=0 , если у нас есть, что протокол не определен и выбран протокол по умолчанию, но если реализован только один протокол (и это обычно так), на самом деле он вообще не определен. Итак, утверждение, что передача 0 обычно в порядке, имеет смысл.

Ответ №1:

Допустимые значения protocol зависят от namespace используемого и ядра, на котором выполняется программа.

Я предполагаю, поскольку вопрос помечен gnu , что вы работаете под Linux. Затем вы можете найти список допустимых пространств имен и ссылки на документацию по этим пространствам man 'socket(2)' имен. Например, вы можете найти документацию для пространств имен Интернета AM_INET и AM_INET6 под man 'ip(7)' и man 'ipv6(7)'

Читая ip(7) справочную страницу, вы можете увидеть, что AM_INET поддерживает протоколы IPPROTO_TCP и IPPROTO_SCTP для потоковых сокетов, IPPROTO_UDP и IPPROTO_UDPLITE для сокетов дейтаграмм.

Если вы хотите копать дальше, разные протоколы также имеют свои собственные справочные страницы