#perl #code-documentation
#perl #код-документация
Вопрос:
Например, в https://perldoc.perl.org/IO/Socket/INET.html в нем перечислены SOCK_STREAM и SOCK_DGRAM как два возможных значения для типа / типа сокета, за которыми следуют многоточия (которые, я полагаю, означают, что существует больше возможных значений). Как мне найти эти другие значения (или это ошибочное предположение)?
В .В NET docs, например, обычно есть какое-то перечисление, где перечислены возможные значения и их значения: https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.updatepanelupdatemode?view=netframework-4.7.2
Кажется, я не могу найти какой-либо подобный эквивалент на сайте perldoc и в целом чувствую себя совершенно потерянным.
Ответ №1:
IO::Socket::INET просто предоставляет более удобный интерфейс для вспомогательных модулей в сокете. В свою очередь, вспомогательные модули в Socket являются простыми оболочками для функций C, макросов C и системных вызовов Unix с одинаковыми именами.
Вы можете получить системную документацию по ним со страниц руководства вашей системы. Для получения документации по конкретному вызову, о котором идет речь, вы можете использовать следующую команду:
man 2 socket
В моей системе,
Сокет имеет указанное
type
, которое определяет семантику связи. В настоящее время определены следующие типы:
SOCK_STREAM
Обеспечивает упорядоченные, надежные, двусторонние потоки байтов на основе соединения. Может поддерживаться механизм внеполосной передачи данных.
SOCK_DGRAM
Поддерживает дейтаграммы (сообщения без установления соединения, ненадежные с фиксированной максимальной длиной).
SOCK_SEQPACKET
Обеспечивает последовательный, надежный, основанный на двустороннем соединении путь передачи данных для дейтаграмм фиксированной максимальной длины; потребителю требуется считывать весь пакет при каждом системном вызове ввода.
SOCK_RAW
Обеспечивает доступ к исходному сетевому протоколу.
SOCK_RDM
Обеспечивает надежный уровень дейтаграмм, который не гарантирует упорядочение.
SOCK_PACKET
Устарел и не должен использоваться в новых программах; см. Пакет (7).
Некоторые типы сокетов могут быть реализованы не во всех семействах протоколов; например,
SOCK_SEQPACKET
не реализовано дляAF_INET
.Начиная с Linux 2.6.27,
type
аргумент служит второй цели: в дополнение к указанию типа сокета, он может включать побитовое ИЛИ любое из следующих значений, чтобы изменить поведениеsocket()
:
SOCK_NONBLOCK
Установите
O_NONBLOCK
флаг состояния файла в описании нового открытого файла. Использование этого флага экономит дополнительные вызовы fcntl(2) для достижения того же результата.
SOCK_CLOEXEC
Установите флаг close-on-exec (
FD_CLOEXEC
) для нового файлового дескриптора. Смотрите описаниеO_CLOEXEC
флага в open(2), чтобы узнать, почему это может быть полезно.
Комментарии:
1. Все ли элементы в модулях ядра являются простыми оболочками? Или только это в частности?
2. POSIX, да. Несмотря на название, вспомогательные модули внутри на самом деле являются просто базовой системой, не обязательно совместимой с POSIX версией. В противном случае ничего не приходит на ум?
Ответ №2:
В IO::Socket::INET
документации это не обязательно полностью очевидно, но в нем есть раздел «См. также», который указывает на оба Socket
и IO::Socket
. Это в Socket
документации, где определены SOCK_STREAM
и SOCK_DGRAM
. Обратите внимание, что в IO::Socket::INET
документации SOCK_STREAM
и SOCK_DGRAM
не заключены в кавычки. То есть они не являются строками. Это подразумевает, что они где-то являются константами, и это где-то находится в Socket
.
Комментарии:
1. Спасибо, но даже страница документа сокета доходит только до SOCK_RAW, прежде чем она завершится многоточием…
Ответ №3:
Для этого конкретного элемента вам нужно посмотреть на Socket , который определяет низкоуровневые процедуры и константы. Процитировать документы о константах:
В каждой из следующих групп может быть предоставлено гораздо больше констант, чем просто те, которые приведены в качестве примеров в заголовке раздела. Если заголовок заканчивается … то это означает, что их, вероятно, больше; точные предоставленные константы будут зависеть от операционной системы и заголовков, найденных во время компиляции.
Socket.pm
Файл на моем Mac, который я нашел в /usr/local/lib/perl5/5.28.1/darwin-thread-multi-2level/Socket.pm
, определяет следующие типы сокетов:
SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM
Остальные сетевые константы также присутствуют. Вероятно, вы захотите выполнить дальнейший поиск по этим именам, чтобы понять, для чего они предназначены.
Редактировать: Чтобы облегчить поиск пути к Socket.pm
, используйте отладчик:
box:~ $ perl -de0
Loading DB routines from perl5db.pl version 1.53
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
DB::DB(-e:1): 0
DB<1> use Socket
DB<2> p $INC{'Socket.pm'}
/usr/local/Cellar/perl/5.28.1/lib/perl5/5.28.1/darwin-thread-multi-2level/Socket.pm
DB<3> q
box:~ $
Это выведет путь, по которому Perl загрузил Socket
пакет.
Комментарии:
1. Вау, это кажется … болезненным. Задокументирован ли где-нибудь путь к каждому файлу или вам просто нужно выполнить поиск по имени файла?
2. Нет причин вызывать режим отладки. Можно было бы использовать
perl -le'use Socket; print $INC{"Socket.pm"};
. Тем не менее,perldoc -lm Socket
это самое простое на сегодняшний день!3. Конечно, но изучение нового способа выполнения чего-либо — неплохая идея.