例如,在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网站上找不到任何类似的东西,总的来说,我感到很失落。
答案 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
文档中,它不一定完全明显,但确实有一个“另请参阅”部分,它同时指向Socket
和IO::Socket
。在Socket
文档中,其中定义了SOCK_STREAM
和SOCK_DGRAM
。请注意,在IO::Socket::INET
文档中,没有引用SOCK_STREAM
和SOCK_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
软件包的路径。