內容

名稱

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 參數,但為 false,則佇列大小將設定為 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 ()

傳回 socket 的 sockaddr 結構的位址部分

sockport ()

傳回 socket 在本機上使用的埠號

sockhost ()

傳回 socket 的 sockaddr 結構的位址部分,格式為文字 xx.xx.xx.xx

peeraddr ()

傳回 socket 在對端主機上的 sockaddr 結構的位址部分

peerport ()

傳回 socket 在對端主機上的埠號。

peerhost ()

傳回 socket 在對端主機上的 sockaddr 結構的位址部分,格式為文字 xx.xx.xx.xx

另請參閱

SocketIO::Socket

作者

Graham Barr。目前由 Perl Porters 維護。請於 https://github.com/Perl/perl5/issues 回報所有錯誤。

版權

版權所有 (c) 1996-8 Graham Barr <gbarr@pobox.com>。保留所有權利。此程式為自由軟體;你可以根據 Perl 本身的條款重新散布或修改它。