Wie unterhalte ich mich mit mehreren Sockets gleichzeitig?

Inhalt:

Sammlung von Beispielen die Kommunikation zwischen Sockets demonstrieren sollen!

Einleitung

Anspruchvolles Beispiel

Interne Kommunikation über Threadgrenzen hinweg, sowie Weiterleitungen an extrenen Server
use strict;
use warnings;

use IO::Socket::INET;
use IO::Select;
use threads;

use constant EXTERNADDR => '127.0.0.1';
use constant EXTERNPORT => 2005;
use constant INTERNADDR => '127.0.0.1';
use constant INTERNPORT => 4711;


sub thread_proc {
    my $externsocket = IO::Socket::INET->new(
        PeerAddr => EXTERNADDR,
        PeerPort => EXTERNPORT,
        Type => SOCK_STREAM,
        Proto => "tcp"
    ) or die "Could not connect to external server : $@\n";

    my $internsocket = IO::Socket::INET->new(
        PeerAddr => INTERNADDR,
        PeerPort => INTERNPORT,
        Type => SOCK_STREAM,
        Proto => "tcp"
    ) or die "Could not connect to internal server : $@\n";

    my $select = IO::Select->new;

    $select->add($externsocket);
    $select->add($internsocket);

    print "Wait for readable socket\n";
    while(my @handles = $select->can_read) {
        foreach my $handle (@handles) {
            my $line = $handle->getline;

            if(defined $line) {
                $line =~ s!\r?\n$!!g;
                if($handle == $internsocket) { # dad talks to us
                    $externsocket->print("$line\n"); # send everything to the external server
                } elsif($handle == $externsocket) { # response from the server
                    print "Server Reply: [$line]\n";
                }
            } else { # socket closed from
                $select->remove($handle);
                $handle->close;
            }
        }
    }

    return (1);
}

my $internserver = IO::Socket::INET->new(
    LocalAddr => INTERNADDR,
    LocalPort => INTERNPORT,
    type => SOCK_STREAM,
    Reuse => 1,
    Listen => 10
) or die "Could not create TCP server socket : $@\n";

my $t = threads->create(\&thread_proc);

if(my $socket = $internserver->accept) { # wait for the thread
    print "Thread connected\n";

    for my $i (0 .. 9) {
        $socket->print("Message #$i\n");
        sleep(1);
    }

    $socket->print("quit\n");
    $socket->close;

    $internserver->close;
}

$t->join; # wait for thread to finish

Ergänzungen, Kommentare

SaschaKieferAkaEsskar - 08 Apr 2005: Nur mal den Code eingefügt, damit er nicht auf meiner Festplatte verloren geht. Kommentare folgen irgendwann

UtilFaqSubForm edit

Titel Wie unterhalte ich mich mit mehreren Sockets gleichzeitig?
Autor SaschaKieferAkaEsskar
Bereich FaqSocket
Topic revision: 2005-04-09, SaschaKieferAkaEsskar
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.