如何在Perl核心模块中找到构造函数的可能值?

时间:2019-04-01 22:51:14

标签: perl code-documentation

例如,在https://perldoc.perl.org/IO/Socket/INET.html,它列出了SOCK_STREAM和SOCK_DGRAM作为类型/套接字类型的两个可能值,其后是省略号(我认为这意味着有更多可能的值)。我如何找到这些其他值(或者这是一个错误的假设)?

例如,在.NET文档中,通常存在某种枚举,其中列出了可能的值及其含义:https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.updatepanelupdatemode?view=netframework-4.7.2

我似乎在perldoc网站上找不到任何类似的东西,总的来说,我感到很失落。

3 个答案:

答案 0 :(得分:3)

IO::Socket::INET只是为Socket中的子页面提供了一个友好的界面。反过来,Socket中的subs是具有相同名称的C函数,C宏和unix系统调用的简单包装。

您可以从系统的手册页上获得特定于系统的文档。有关所涉及的特定呼叫的文档,可以使用以下命令:

man 2 socket

在我的系统上,

  

套接字具有指示的type,它指定了通信语义。当前定义的类型是:

     
      
  • SOCK_STREAM

         

    提供基于连接的顺序,可靠,双向的字节流。可以支持带外数据传输机制。

  •   
  • SOCK_DGRAM

         

    支持数据报(固定长度的无连接,不可靠的消息)。

  •   
  • SOCK_SEQPACKET

         

    为固定最大长度的数据报提供有序的,可靠的,基于双向连接的数据传输路径;消费者需要在每次输入系统调用时读取整个数据包。

  •   
  • SOCK_RAW

         

    提供原始网络协议访问。

  •   
  • SOCK_RDM

         

    提供了一个可靠的数据报层,它不能保证排序。

  •   
  • SOCK_PACKET

         

    已过时,不应在新程序中使用;参见packet(7)。

  •   
     

某些套接字类型可能并非所有协议家族都实现;例如,SOCK_SEQPACKET未针对AF_INET实现。

     

自Linux 2.6.27起,type参数起第二个作用:除了指定套接字类型外,它还可以包含以下任意值的按位或,以修改{{1 }}:

     
      
  • socket()

         

    在新的打开文件说明中设置SOCK_NONBLOCK文件状态标志。使用此标志可以节省对fcntl(2)的额外调用,以达到相同的结果。

  •   
  • O_NONBLOCK

         

    在新文件描述符上设置close-on-exec(SOCK_CLOEXEC)标志。有关为何可能有用的原因,请参见open(2)中的FD_CLOEXEC标志说明。

  •   

答案 1 :(得分:1)

IO::Socket::INET文档中,它不一定完全明显,但确实有一个“另请参阅”部分,它同时指向SocketIO::Socket。在Socket文档中,其中定义了SOCK_STREAMSOCK_DGRAM。请注意,在IO::Socket::INET文档中,没有引用SOCK_STREAMSOCK_DGRAM 。也就是说,它们不是字符串。这意味着它们在某处是常数,而在Socket中则是常数。

答案 2 :(得分:1)

对于此特定项目,您需要查看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软件包的路径。