DEV Community

Cover image for Perl TCP client/server sample code
Tib
Tib

Posted on

13 1

Perl TCP client/server sample code

This post explains how to implement a simple Perl client/server using TCP sockets 🎉

I use IO::Socket::INET which is a core module (no need to install). How to know it's a core module? Check the list of core modules in perldoc or simply use corelist:



$ corelist IO::Socket::INET

Data for 2019-05-22
IO::Socket::INET was first released with perl v5.6.0


Enter fullscreen mode Exit fullscreen mode

Without waiting, let's move on to the Perl TCP client implementation 👍

Perl TCP Client

A very simple client, sending a message (containing "japh - " + the client timestamp) every 3 sec and stopping on signal (Control-C).

The target is localhost (for demo I'm running client and server on same machine) but it could be totally another IP or hostname (obviously... 😀).



#!/usr/bin/env perl

use strict;
use warnings;

use IO::Socket::INET;
# auto-flush on socket
$| = 1;

my $continue = 1;
$SIG{INT} = sub { $continue = 0 };


while ($continue) {
    my $timestamp = localtime(time);
    my $msg = "japh - $timestamp";

    # Create a connecting socket
    my $socket = new IO::Socket::INET (
        PeerHost => 'localhost',
        PeerPort => '7777',
        Proto => 'tcp',
    );

    if($socket) {
        my $size = $socket->send($msg);
        print "Sent!\n";
        $socket->close();
    }

    sleep 3;
}


Enter fullscreen mode Exit fullscreen mode

Start client:



$ perl client.pl


Enter fullscreen mode Exit fullscreen mode

The client sends data then wait 3 seconds, then sends data again and wait, and do it again and again...

As soon as we have the server running, a client live run will look like this:
Client

If you wonder, if the server is not available, no problem, the client will stay alive (and send to nobody until a server is started).

Perl TCP Server

The server looks the same, but is just a bit more complicated with more parameters to $socket constructor and an accept() step:



#!/usr/bin/env perl

use strict;
use warnings;

use IO::Socket::INET;
# auto-flush on socket
$| = 1;


# Creating a listening socket
my $socket = new IO::Socket::INET (
    LocalHost => '0.0.0.0',
    LocalPort => '7777',
    Proto => 'tcp',
    Listen => 5,
    Reuse => 1
);
die "Cannot create socket $!\n" unless $socket;

$SIG{INT} = sub { $socket->close(); exit 0; };

while(1) {
    my $client_socket = $socket->accept();

    # Get information about a newly connected client
    my $client_address = $client_socket->peerhost();

    # Read up to 1024 characters from the connected client
    my $data = "";
    $client_socket->recv($data, 1024);
    print "$client_address - $data\n";
}



Enter fullscreen mode Exit fullscreen mode

The $socket->accept() is blocking and will unblock when the client initiates the connection (new IO::Socket::INET on client side).

The server will retrieve the message ($msg) but also the IP address ($client_address via peerhost() method). It is listening forever and can handle multiple clients.

Below a demo of a running server:
Server

Now with these sample code in your toolbox, you're ready to implement a custom simple small client/server or a very basic monitoring software! 😁 💪

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (1)

Collapse
 
yukikimoto profile image
Yuki Kimoto

Good examples of IO::Socket::INET.

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay