内容

名称

IO::Socket::INET - AF_INET 域套接字的对象接口

概要

use IO::Socket::INET;

描述

IO::Socket::INET 提供了在 AF_INET 域中创建和使用套接字的对象接口。它建立在 IO::Socket 接口之上,并继承了 IO::Socket 定义的所有方法。

构造函数

new ( [ARGS] )

创建一个 IO::Socket::INET 对象,它是一个指向新创建符号的引用(参见 Symbol 包)。new 可选地接受参数,这些参数以键值对的形式给出。

除了 IO::Socket 接受的键值对之外,IO::Socket::INET 还提供了以下参数。

PeerAddr    Remote host address          <hostname>[:<port>]
PeerHost    Synonym for PeerAddr
PeerPort    Remote port or service       <service>[(<no>)] | <no>
LocalAddr   Local host bind address      hostname[:port]
LocalHost   Synonym for LocalAddr
LocalPort   Local host bind port         <service>[(<no>)] | <no>
Proto       Protocol name (or number)    "tcp" | "udp" | ...
Type        Socket type              SOCK_STREAM | SOCK_DGRAM | ...
Listen      Queue size for listen
ReuseAddr   Set SO_REUSEADDR before binding
Reuse       Set SO_REUSEADDR before binding (deprecated,
                                             prefer ReuseAddr)
ReusePort   Set SO_REUSEPORT before binding
Broadcast   Set SO_BROADCAST before binding
Timeout     Timeout value for various operations
MultiHomed  Try all addresses for multi-homed hosts
Blocking    Determine if connection will be blocking mode

如果定义了 Listen,则创建一个监听套接字,否则如果从协议派生的套接字类型为 SOCK_STREAM,则调用 connect()。如果给出了 Listen 参数,但为假,则队列大小将设置为 5。

虽然不违法,但在非阻塞模式下对套接字使用 MultiHomed 几乎没有用。这是因为第一个连接永远不会因超时而失败,因为连接调用不会阻塞。

PeerAddr 可以是主机名或“xx.xx.xx.xx”形式的 IP 地址。PeerPort 可以是数字或符号服务名称。服务名称后面可能跟一个括号中的数字,该数字在系统未知服务时使用。PeerPort 规范也可以通过在前面加上“:”嵌入到 PeerAddr 中。

如果未提供Proto且指定了符号PeerPort端口,则构造函数将尝试从服务名称推断Proto。作为最后的手段,将假设Proto为“tcp”。如果未指定,则Type参数将从Proto推断。

如果构造函数只传递一个参数,则假定该参数为PeerAddr规范。

如果将Blocking设置为0,则连接将处于非阻塞模式。如果未指定,则默认为1(阻塞模式)。

示例

$sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
                              PeerPort => 'http(80)',
                              Proto    => 'tcp');

$sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');

$sock = IO::Socket::INET->new(Listen    => 5,
                              LocalAddr => 'localhost',
                              LocalPort => 9000,
                              Proto     => 'tcp');

$sock = IO::Socket::INET->new('127.0.0.1:25');

$sock = IO::Socket::INET->new(
                        PeerPort  => 9999,
                        PeerAddr  => inet_ntoa(INADDR_BROADCAST),
                        Proto     => 'udp',
                        LocalAddr => 'localhost',
                        Broadcast => 1 ) 
                    or die "Can't bind : $IO::Socket::errstr\n";

如果构造函数失败,它将返回undef并将$IO::Socket::errstr包变量设置为包含错误消息。

$sock = IO::Socket::INET->new(...)
    or die "Cannot create socket - $IO::Socket::errstr\n";

出于向后兼容的原因,错误消息也会设置到全局$@变量中,您仍然可能会发现旧代码在这里查找。

$sock = IO::Socket::INET->new(...)
    or die "Cannot create socket - $@\n";

方法

sockaddr ()

返回套接字的 sockaddr 结构的地址部分

sockport ()

返回套接字在本地主机上使用的端口号

sockhost ()

以文本形式 xx.xx.xx.xx 返回套接字的 sockaddr 结构的地址部分

peeraddr ()

返回对等主机上套接字的 sockaddr 结构的地址部分

peerport ()

返回对等主机上套接字的端口号。

peerhost ()

以文本形式 xx.xx.xx.xx 返回对等主机上套接字的 sockaddr 结构的地址部分

另请参阅

SocketIO::Socket

作者

Graham Barr。目前由 Perl 维护者维护。请在 https://github.com/Perl/perl5/issues 报告所有错误。

版权

版权所有 (c) 1996-8 Graham Barr <[email protected]>。保留所有权利。本程序是自由软件;您可以在 Perl 本身的相同条款下重新发布和/或修改它。