www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Kapitel 17: Kommunikation und Netze

Inhalt
Synopsis
# Sperrdatei anlegen, z.B. für Singleton-Eigenschaft:
sysopen(LOCKFILE, $fname, O_CREAT | O_EXCL, $mode) or die "...: $!\n";

# Signalhandler können über dem %SIG-Hash installiert werden
@SIG{qw(INT HUP TERM)} = (sub { my $sig = shift; ... }) x 3;
$SIG{'CHLD'} = sub { wait(); };  # Zombie-Killer

# Pipes und FIFOs
pipe READFH, WRITEFH       or die "...";
use POSIX qw(mkfifo);
mkfifo("/tmp/afifo", 0666) or die "...";

# Semaphoren, Message-Queues und Shared Memory
use IPC::SysV;
use IPC::Semaphore;
use IPC::Msg;
$sem = new IPC::Semaphore(IPC_PRIVATE, $nsems, S_IRWXU | IPC_CREAT);
$sem->setall(@initvalues);
$sem->op($semnum, +1, $flags);   # +1: V(), -1: P()
$sem->remove();

$msg = new IPC::Msg(ftok(RENDEZVOUS, RVID), S_IRWXU | IPC_CREAT);
$msg->snd($prio, $text, $flags); # $flags opt., z.B. IPC_NOWAIT
$gotprio = $msg->rcv($buf,$BUFLEN,$prio,$flags);
$msg->remove();

use IPC::Shareable;     # %h in Shared Memory
tie %h, IPC::Shareable, 'glue', { create => 1, mode => 0666 };
(tied %h)->shlock();
   $temp = $h{'cmplxstruct'};
   push(@{ $temp }, "newvalue");
   $h{'cmplxstruct'} = $temp;
(tied %h)->shunlock();

# Unix-Domain: Client und Server
$clnt = new IO::Socket::UNIX( Peer  => "ux.s", Type => SOCK_STREAM );
print $clnt "hello, this is a client\n"; chomp($srvr_reply = <$clnt>);

$srvr = new IO::Socket::UNIX( Local  => "ux.s", Type => SOCK_STREAM,
                              Listen => 5 );
$conn = $srvr->accept();  # $conn ist die Verbindung zum Client

# Unix-Domain: Datagrammkommunikation
$dgram = new IO::Socket::UNIX( Local => "dg.s", Type => SOCK_DGRAM );
$dgram->send($output, length($output));
$length = $MAXLEN; $dgram->recv($input, $length);

# UDP: verbindungslose Kommunikation
use IO::Socket; use Socket;
$udp_cli = new IO::Socket::INET( Proto => 'udp' );
$udp_srv = new IO::Socket::INET( LocalPort => $port, Proto => 'udp' );

$to_addr = sockaddr_in(getservbyname('time', 'udp'),
                       gethostbyname($hostname));
$udp_cli->send($buffer, $nbytes, $to_addr);
$from_addr = $udp_cli->recv($buffer, $maxlen, $flags);
$from_hostname = gethostbyaddr((sockaddr_in($from_addr))[1], AF_INET);

# TCP: verbindungsorientierte Kommunikation
$clnt = new IO::Socket::INET(PeerAddr => "www.perl.com", PeerPort => 80,
                             Proto    => 'tcp',          Timeout  => 30)
    or die "can't connect: $@\n";   # Beachte: $@, nicht $!

$srvr = new IO::Socket::INET(LocalPort => $portnum,
                             Reuse => 1, Listen => 5) or die "...";
while ($client = $srvr->accept()) {
    # Verbindung über $client führen, evtl. in Kindprozess
    $log="Connection from ",$client->peerhost(),":",$client->peerport();

    print $client "hello, this is server!"; chomp($input = <$client>);
    $client->close();
}

# Mail senden mit Net::SMTP
$smtp = Net::SMTP->new($mailhost, Hello => $mydomain, Timeout => $to);
$smtp->mail($from); $smtp->to(@receivers);  # SMTP-Envelope
$smtp->data();
  $stmp->datasend($header); $stmp->datasend("\n"); $smtp->datasend($body);
$smtp->dataend(); $smtp->quit();

# Mail empfangen mit Net::POP3
$pop3 = Net::POP3->new($pophost, Timeout => $to);
$pop3->login($user, $pass);
$phash = $pop3->list();
foreach my $msgnr (keys %{ $phash }) {
    $msg = $pop3->get($msgnr) if $phash->{$msgnr} < $maxbytes;
    $pop3->delete($msgnr);    # Nachricht zum löschen markieren
}
$pop3->quit(); # markierte Nachrichten löschen, und tschüß!

# FTP: Dateien besorgen
$ftp = Net::FTP->new($ftphost); $ftp->login("anonymous", $myemailpass);
$ftp->cwd("/pub"); $ftp->binary(); $ftp->get($file, $to); $ftp->quit();

# RPC mit RPC::pClient und RPC::pServer
Beispielprogramme
env-printall.pl Zeigt alle Umgebungsvariablen an
env-child.pl Informationsübergabe mit Umgebungsvariablen
pipe-uni.pl Zeigt unidirektionale Pipes Eltern => Kind
pipe-bi.pl Bidirektionale Pipes Eltern <=> Kind
fifo-server.pl Erzeugt eine FIFO und wartet auf Aufträge
fifo-client.pl Sendet Aufträge in eine FIFO hinein
sema-demo.pl Erzeuger/Verbraucher-Problem mit Semaphoren
ipcmsg1.pl Erzeugt eine Message-Queue
ipcmsg2.pl Füllt eine Message-Queue mit Werten
ipcmsg3.pl Liest einige Einträge der Message-Queue
ipcmsg4.pl Extrahiere die restlichen Elemente der Message-Queue
ipcp1.pl Erzeugt ein Shared-Memory-Segment
ipcp2.pl Liest und schreibt in einem SHM-Segment
ipcp3.pl Liest das SHM-Segment aus und gibt es dann frei
ipc-shareable1.pl Zeigt die Verwendung des IPC::Shareable-Moduls
ipc-shareable2.pl Liest das Shared-Memory-Segment wieder aus
apache-mmap-demo.pl Zeigt lokale IPC mit Apache::Mmap
apache-mmap-reader.pl Liest aus einer mmap()ten Datei
ux-client.pl Ein einfacher UNIX-Domain-Socket-Client
ux-server.pl Ein einfacher UNIX-Domain-Socket-Server
ux-dgram-server.pl Einfacher UNIX-Domain-Socket-Server. Dgram
udp-client.pl UDP-Client fragt Zeit diverser Hosts ab
udp-server.pl Ein einfacher Tagline-Server, UDP-basiert
udp-tagclient.pl UDP-Client fragt nach einer Tagline
tcp-client.pl Ein einfacher TCP-Client
tcp-mtclient.pl Ein multithreaded interaktiver TCP-Client
tcp-selectclient.pl Ein single-threaded interaktiver TCP-Client
tcp-server-st.pl Ein Single-threaded-TCP-Server
tcp-server-mt-zombies.pl Ein Multithreaded-TCP-Server, Zombies.
tcp-server-mt.pl Ein Multithreaded-TCP-Server
tcp-server-ioselect.pl Ein Single-threaded-TCP-Server mit select()
net-daemon-demo.pl Unser Umdrehserver mit Net::Daemon
smtp.pl Sendet Mails mit Net::SMTP. Ein kleiner Wrapper.
pop3.pl Hole E-Mails mit dem POP3-Protokoll und Net::POP3
ftp-client.pl Hole eine Liste FTP-URLs von FTP-Servern
p-Server.pl Ein einfacher RPC-Server mit RPC::pServer
p-Client.pl Ein einfacher RPC-Client mit RPC::pClient
Ergänzungen
Lösungen zu ausgewählten Übungsaufgaben

In Vorbereitung

FAQ
Wie kann ich, von Perl aus, mehrere Prozesse gleichzeitig starten und anschließend darauf warten, daß sie sich beenden?
Wenn Sie ein Unix-ähnliches System verwenden, das die Funktionen fork() und exec() anbietet, können Sie folgendes Gerüst verwenden: n-progs.pl.
Errata

[Prev] [Up] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:44 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo