#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
для сокетов дейтаграмм.
Если вы хотите копать дальше, разные протоколы также имеют свои собственные справочные страницы