Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Socket-Programmierung in Perl ohne IO::SOCKET

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.02.2004
    Beiträge
    60

    Socket-Programmierung in Perl ohne IO::SOCKET

    Servus,

    ich muss nen Chat in Perl programmieren, ohne jedoch IO::SOCKET zu benutzen. Leider find ich im Netz nirgendwo ne Anleitung. Alles was ich finde, sind Tutorials, die diese API IO::SOCKET nutzen....

    Könnt ihr mir ein paar Tips geben, oder kennt ihr ne Seite, wo das erklärt wird. Hab nämlich keine Ahnung von Perl.

    THX
    clumsy

  2. #2
    Registrierter Benutzer Avatar von Molaf
    Registriert seit
    15.11.2004
    Beiträge
    127
    Welche Module stehen denn zur Verfügung?

    Und warum kann man IO nicht nutzen, bzw. nicht nachinstallieren?

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.02.2004
    Beiträge
    60
    ist ne aufgabe. nur Socket steht zur Verfügung....

  4. #4
    Registrierter Benutzer Avatar von Molaf
    Registriert seit
    15.11.2004
    Beiträge
    127
    Öffne doch einfach zwei Shells mit perldoc Socket und perldoc IO::Socket
    Die Funktionen sind recht ähnlich, aus dem Vergleich liesse sich dann ja aus den gefundenen Tutorials das nötige herausholen.

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.02.2004
    Beiträge
    60
    cool, danke! das mit perldoc kannte ich net...

    allerdings hab ich nun ein anderes problem. ich will in perl einen mini-chat schreiben. hab den server soweit, dass er lauscht und ne nachricht ausgibt, von wo die verbindung kommt. der client kann sich connecten und bekommt dann vom server ne nachricht auf die console.
    wie kann ich aber nun nachrichten hin und her schicken? ich hab's mit print, send und recv und select probiert (bzw. kombinationen davon). aber immer kann ich nur am client empfangen bzw. ausgeben.
    hier mal mein server: (hab nicht nur das was drinsteht ausprobiert...)
    Code:
    #!/usr/bin/perl
    
    use strict;
    use Socket;
    
    my $port = shift;
    my $nickname = shift;
    my $proto = getprotobyname('tcp');
    
    socket(SERVER, PF_INET, SOCK_STREAM, $proto) 
    	or die "Konnte socket nicht erstellen: $!";
    setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1)
            or die "setsock: $!";
    my $paddr = sockaddr_in($port, INADDR_ANY);
    
    bind(SERVER, $paddr) 
    	or die "bind() hat nicht funktioniert: $!";
    listen(SERVER, SOMAXCONN) 
    	or die "listen() hat nicht funktioniert: $!";
    
    print "Talk-Server waiting for connections.\n";
    
    my $client_addr;
    my $line;
    
    while($client_addr = accept(CLIENT, SERVER)) {
    	my ($client_port, $client_ip) = sockaddr_in($client_addr);
    	my $client_ipnum = inet_ntoa($client_ip);
    	my $client_host = gethostbyaddr($client_ipnum, AF_INET);
    	print "got a connection from: $client_host [$client_ipnum]\n";
    
      # send them a message, close connection
    #	$line = <CLIENT>;
    #	print $line;
    	print CLIENT "Hello from the server! \n";
    	print;
    	close CLIENT;
    #	close SERVER;
    }
    
    #for ( ; $paddr = accept(CLIENT,SERVER); close Client) {
    #    my($port,$iaddr) = sockaddr_in($paddr);
    #    my $name = gethostbyaddr($iaddr,AF_INET);
    #     print CLIENT "Hello there, it's me now ";
    #    }
    hier der client:
    Code:
    #! /usr/bin/perl
    # talkclient.pl
    
    use strict;
    use Socket;
    
    # initialize host and port
    my $host = shift;
    my $port = shift;
    my $nickname = shift;
    my $proto = getprotobyname('tcp');
    my $line;
    
    # get the port address
    my $iaddr = gethostbyname($host);
    my $paddr = sockaddr_in($port, $iaddr);
    
    # create the socket, connect to the port
    my $sock = socket(TO_SERVER, PF_INET, SOCK_STREAM, $proto) 
                            or die "socket: $!";
    connect(TO_SERVER, $paddr) or die "connect: $!";
    
    #while (defined($line = <TO_SERVER>)) {
    #        print $line;
    #}
    #close (TO_SERVER) || die "close: $!";
    #    exit;
    
    while (<TO_SERVER>) {
    #	send(TO_SERVER, $puffer
    	print TO_SERVER "huhu, client hier\n";
    #	select(CLIENT);
    #	$| = 1; 
        print CLIENT "Hier ist der client\n";
    #	select(STDOUT);
    #	close TO_SERVER;
    #	print CLIENT "whileschleife\n";
    	print;
    }
    close TO_SERVER or die "close: $!";
    was ich auch nicht verstehe: wenn ich im server die zeile in der while-schleife "close CLIENT" auskommentiere, dann kommt beim client kein "hello from the server" an. ich ahne zwar, dass es etwas mit der pufferung der streams zu tun hat, aber weiter weiß ich net.

    clumsy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •