17.1.3. Discussion
While coding this by hand requires a lot of steps, the
IO::Socket::INET class wraps them all in a convenient constructor.
The important things to know are where you're going (the PeerAddr and
PeerPort parameters) and how you're getting there (the Type
parameter). IO::Socket::INET tries to determine these things from
what you've given it. It deduces Proto from the Type and Port if
possible, and assumes tcp otherwise.
PeerAddr is a string containing either a hostname
("www.oreilly.com") or an IP address
("208.201.239.36"). PeerPort is an integer,
representing the port number to connect to. You can embed the port
number in the address by giving an address like
"www.oreilly.com:80". Type is the kind of socket
to create: SOCK_DGRAM for datagrams or SOCK_STREAM for streams.
If you want a SOCK_STREAM connection to a port on a particular
machine with no other options, pass a single string to
IO::Socket::INET->new consisting of the
hostname and port separated by a colon:
$client = IO::Socket::INET->new("www.yahoo.com:80")
or die $@;
If an error occurs, IO::Socket::INET will return
undef and $@
(not $!) will be set to the
error message.
$s = IO::Socket::INET->new(PeerAddr => "Does not Exist",
Peerport => 80,
Type => SOCK_STREAM )
or die $@;
If your packets are disappearing into a network void, it can take a
while for your inability to connect to a port to be recognized. You
can decrease this time by specifying a Timeout
parameter to IO::Socket::INET->new( ):
$s = IO::Socket::INET->new(PeerAddr => "bad.host.com",
PeerPort => 80,
Type => SOCK_STREAM,
Timeout => 5 )
or die $@;
If you do this, though, there's no way to tell from
$! or $@ whether you couldn't
connect or whether you timed out. Sometimes it's better to set it up
by hand instead of using a module.