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 (
"204.148.40.9"
). PeerPort is an integer, 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.

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()
:

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.

INADDR_ANY is a special address, meaning "listen on any interface." If you want to restrict it to a particular IP address, add a
LocalAddr
parameter to your call to
IO::Socket::INET->new.
If coding by hand code, do this: