Как мне найти возможные значения для конструктора в основных модулях Perl? - PullRequest
1 голос
/ 02 апреля 2019

Например, в https://perldoc.perl.org/IO/Socket/INET.html, он перечисляет SOCK_STREAM и SOCK_DGRAM как два возможных значения для типа Type / Socket, за которыми следуют эллипсы (которые, как я предполагаю, означают, что есть и другие возможные значения).Как мне найти эти другие значения (или это ошибочное предположение)?

Например, в документах .NET обычно есть какой-то тип Enum, где перечислены возможные значения и их значения: https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.updatepanelupdatemode?view=netframework-4.7.2

Кажется, я не могу найти такого эквивалента на сайте perldoc, и в целом я чувствую себя совершенно растерянным.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

IO :: Socket :: INET просто обеспечивает более дружественный интерфейс для сабвуферов в Socket . В свою очередь, сабвуферы в 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 голос
/ 02 апреля 2019

Для этого конкретного элемента вы захотите взглянуть на Сокет , который определяет низкоуровневые процедуры и константы.Чтобы процитировать документы о константах:

В каждой из следующих групп может быть предусмотрено гораздо больше констант, чем только те, которые приведены в качестве примеров в заголовке раздела.Если заголовок заканчивается ... то это означает, что, вероятно, их больше;точные предоставленные константы будут зависеть от ОС и заголовков, найденных во время компиляции.

Файл 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 голос
/ 02 апреля 2019

В документации IO::Socket::INET это не обязательно полностью очевидно, но в ней есть раздел «См. Также», в котором указываются как Socket, так и IO::Socket.В документации Socket определены SOCK_STREAM и SOCK_DGRAM.Обратите внимание, что в документации IO::Socket::INET SOCK_STREAM и SOCK_DGRAM не указаны .То есть они не являются строками.Это означает, что они где-то являются константами, и что где-то находится в Socket.

...