Description: When I need to interact with the raw IO of telnetting to a port or creating a hand rolled implementation of my own service, I use IO::Socket. My most recent endeavor was for a need to check weather or not services were running on a regular basis. I will show some excepts from the code later on in this post.
Although IO::Socket::INET is just a frontend for a good number of Perl’s builtin functions, I find it handy as it is generally a little more sane.
CPAN: IO::Socket::INET
Note: IO::Socket::INET is a subclass of IO::Socket.
Example 1:
This example is the socket portion of a script that checks to see if certain daemons are alive. It does this by connecting to the port that they should be listening on. If it receives a response, then the daemon is alive, if not, it restarts the daemon and tries contacting it again. As you can see below, the response itself doesn’t matter, just that there is a response being received.
# Always be safe and smart use strict; use warnings; # Use the module use IO::Socket; # Prototype the socket my $socket = new IO::Socket::INET( PeerAddr => "localhost", # Hostname/IP PeerPort => "smtp(25)", # Service (Port) Proto => "tcp", # Protocol ) or die "Socket bind error: $!"; # Create the socket $socket or die "Socket error: $!"; # Close the socket close $socket or die "Socket close error: $!";
Example 2:
On the other side of the fence, we can create a listening socket that can act as a server. If you run this little script and then connect to the specified port it will say something along the following:
1 | Welcome 127.0.0.1 to a simple socket server. |
The server script will listen indefinitely (or at least until you press CTRL-C to make it exit). To test out the script and ensure you receive something similar to the above response (with your IP instead of 127.0.0.1), from the linux command prompt, type the following (replace with your IP and port):
1 | $ telnet localhost 12345 |
# Always be safe and smart use strict; use warnings; # Use the module use IO::Socket; # Listen port my $port = 12345; # Prototype the socket my $server = new IO::Socket::INET( Listen => SOMAXCONN, # Max connections allowed by system Reuse => 1, # Reuse connections LocalAddr => "localhost", # Listen hostname LocalPort => $port, # Listen port Proto => "tcp", # Listen protocol ) or die "Socket bind error: $!"; # Listen for the client until we get a CTRL-C while (my $client = $server->accept()) { # Force the data out of the stack $client->autoflush(1); # Say hello to my little client print $client "Welcome ". $client->peerhost ." ". "to a simple socket server.\n"; } # Close the server when we are done close $server or die "Socket close error: $!";