Listing 5. mp3_recv.pl An IP Telephone in 74 Lines of PERL
The Perl Journal, Fall 2000
 

mp3_recv.pl accepts MP3-encoded telephone calls.

 0    #!/usr/bin/perl
 1    # file: mp3_recv.pl

 2    use strict;
 3    use DSP;
 4    use IO::Socket;

 5    use constant BUFSIZE => 1024;
 6    $SIG{CHLD} = sub { wait; };

 7    my $dest = shift || 'prego';
 8    my $port = shift || 2007;
 9    my $listen = IO::Socket::INET->new(LocalPort => $port,
 10                                      Listen => 5,
 11                                       Reuse => 1) || die "Can't listen: $!";

 12   while (1) {
 13       warn "waiting for a connection...\n";
 14       my $sock = $listen->accept;
 15       warn "accepting connection from ", $sock->peerhost,"\n";
 16       unless (my $dsp = new DSP) {
 17           warn "DSP unavailable.  Hanging up.\n";
 18           close $sock;
 19       } else {
 20           handle_connection($sock, $dsp);
 21       }
 22   }

 23   sub handle_connection {
 24       my ($sock, $dsp) = @_;
 25       my $child = fork();
 26       die "Can't fork: $!" unless defined $child;
 27       my $data;
 28       if ($child) { # parent process
 29           eval {
 30             local $SIG{INT} = sub {die};
 31             my $uncompress = $dsp->uncompress;
 32             print $uncompress $data while sysread($sock, $data, BUFSIZE);
 33           };
 34           close $sock;
 35           kill TERM => $child;
 36       } else {
 37           close $listen;
 38           my $compress = $dsp->compress;
 39           print $sock $data while sysread($compress, $data, BUFSIZE);
 40           exit;
 41       }
 42   }