Perl: Socket Listener

Da ich das Thema sehr reizvoll finde und ich selbst vor einigen Wochen vor der Aufgabe stand, möchte ich Euch gerne zeigen, wie schnell man einen Socket Listener unter Perl realisiert bekommt. Perl eignete sich in meinem Fall am Besten dazu, weil dies grundsätzlich auf meinen Servern installiert ist und es meiner Meinung nach eine alte, aber dennoch sehr produktive Sprache ist.

Doch was ist überhaupt ein Socket Listener? Die Antwort ist relativ leicht zu verstehen. Ein Socket Listener überwacht einen bestimmten Port eines Servers und wartet auf Verbindungen und / oder Befehle, die er dann an spezielle Anwendungen weiterreichen oder selber auswerten kann.

#!/usr/bin/perl -w

use strict;
use IO::Socket;

# Konstruktor der Socket Klasse
my $sock = new IO::Socket::INET(
LocalHost => 'localhost',
LocalPort => 8080,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1
);

# Socket initialisieren oder Fehlermeldung ausgeben
$sock or die "no socket :$!";
my($new_sock, $c_addr, $buf);

# Socket aufbauen und auf Verbindung warten lassen
while (($new_sock, $c_addr) = $sock->accept()) {
my ($client_port, $c_ip) = sockaddr_in($c_addr);
my $client_ipnum = inet_ntoa($c_ip);
my $client_host =gethostbyaddr($c_ip, AF_INET);
print "got a connection from: $client_host"," [$client_ipnum] ";

# Ausgabe des Buffers
while (defined ($buf = <$new_sock>)) {
print $buf;
}
}

Das ist der Server, der, in diesem Fall Port 8080, überwacht und Euch Bescheid gibt, sobald sich jemand mit diesem Port verbindet. Um nun aber auch zu testen, ob eine Verbindung aufgebaut werden kann, habe ich direkt einen Client programmiert, der den Socket gezielt mit einer Nachricht anspricht:

#!/usr/bin/perl -w

use strict;
use IO::Socket;

# Einstellungen vom Server
my $host = shift || 'localhost';
my $port = shift || 8080;

# Socket konstruieren und initialisieren
my $sock = new IO::Socket::INET(PeerAddr => $host, PeerPort => $port, Proto => 'tcp');
$sock || die "no socket :$!";

# Alle 10 Sekunden die lokale Zeit an den Server übermitteln
foreach my $i (1..10) {
print $sock "$i",scalar(localtime)," ";
sleep(1);
}

# Socket schließen
close $sock;

Jetzt solltet Ihr auf Eurem Server sehen, wie sich eine Verbindung aufbaut und Euch im Abstand von einer Sekunde die aktuelle Systemzeit übermittelt. Und das war es dann auch schon: Fertig ist Euer Perl Socket Listener!

  1. Ulf M.

    Klasse Script, hat auf Anhieb funktioniert!

    November 24th, 2009 // Reply

Add your comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">

THE SOURCE OF CODE DOMINATION