Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Perl] Problema Client-Server

    io ho un problema sun un programma in perl client-server.
    il problema è che la connessione avviene perfettamente, ma cade subito! il codice è questo:
    SERVER:

    #/usr/bin/perl -Tw

    #
    # A sample TCP server using Internet-domain sockets
    #

    require 5.002;
    use strict;
    BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
    use Socket;
    use Carp;

    sub logmsg { print "$0 $$: @_ on ", scalar localtime, "\n" }

    my $port = 4500;
    my $proto = getprotobyname "tcp";

    socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket error: $!";
    setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt error: $!";
    bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind error: $!";
    listen(Server, SOMAXCONN) || die "listen error: $!";

    logmsg "server started on port $port";

    my($paddr, $i);

    $SIG{CHLD} = \&REAPER;

    for (; {

    $paddr = accept Client, Server;
    my($port, $iaddr) = sockaddr_in($paddr);
    my $name = gethostbyaddr $iaddr, AF_INET;

    logmsg "connection from $name [", inet_ntoa($iaddr), "] at port $port";
    print Client "Hello there, $name, it's now ", scalar localtime, "\n";
    close Client;
    }

    CLIENT:


    #!/usr/bin/perl -w

    #
    # A sample TCP client using Internet-domain sockets
    #

    require 5.002;
    use strict;
    use Socket;

    my($remote, $port, $iaddr, $paddr, $proto, $line);

    $remote = "localhost";
    $port = 4500;

    $iaddr = inet_aton($remote);
    $paddr = sockaddr_in($port, $iaddr);

    $proto = getprotobyname("tcp");
    socket(S, PF_INET, SOCK_STREAM, $proto) || die "socket error: $!";
    connect(S, $paddr) || die "connect error: $!";

    while ( $line = <S> ) {

    print $line;
    }

    close(S) || die "close error: $!";
    Perfavore!!aiutatemi...

  2. #2
    Hmmm, il codice è molto incasinato.
    Mi è capito di programmare in perl con socket qualche volta. L'unica cosa che ti posso consigliare è la libreria IO::Socket::INET e IO::Socket .
    Rende la vita molto più facile.
    Fai quello che vuoi in poche righe.^^

    BUona fortuna, ciao
    ...

  3. #3
    si infatti ora l'ho usato xò mi da un problema..

    quando vado a chiedere di inserire un comando io usavo <STDIN>
    ora invece io lo devo fare con <$client> e il problema che mi da è:

    1) formattazione del testo strana cioè lui scrive cosi:

    get register Name
    --->pigio Invio
    (ci sono gli spazi) 000 tizio
    --->scrivo comando

    (ci sono gli spazi) 000 caio

    invece se metto il comando <STDIN> appena pigio invio nn fa niente continua a chiedere caratteri.

  4. #4
    invece di usare <$connessione>, usa il comando recv.
    Non ricordo bene la sintassi. Dovrebbe essere quaqlcosa del tipo

    $linea='';
    while(1) {
    recv($connessione,$buffer='',$dim_massima_del_Pacc hetto,0);

    die "Connessione caduta\n" if($buffer eq "");
    $linea.=$buffer; # Accodo l'ultimo carattere/pacchetto inserito.
    last if $linea=~/\n/; # Se contiene un ritorno a capo esco dal ciclo.
    }

    E' possibile che esca dal ciclo anche se la variabile $linea contenga più linee. TIpo se arriva un pacchetto enorme con tutte le informazioni. In quel caso ti basta fare uno split e dividere $linea per ogni carattere \n che trova

    Ah, gli spazzi che dici te sono dovuti in realtà ad una manzanza del ritorno di carello.
    Ossia, ti manca un \r alla fine della riga.
    \n torna a capo, \r torna ad inizio riga.
    Aggiungilo te manualmente il \r quando vai a stampare la riga.
    Cioè, non mi ricordo se è il \r o \n.
    Vabbè, dimmi se hai altri problemi.
    Ciao
    ...

  5. #5
    grazie ho risolto mettendo solo lo \r cmq adesso quando pigio exit come faccio a chiudere solo il client lasciando il server sempre aperto??

    io ho fatto close $client;

    funzionare funziona...perchè mi dice " Connection to Host Lost " ma se poi riprovo a fare il telnet mi si impalla tutto il client.

  6. #6
    posta il codice del server.
    Hai usato io::socket giusto?
    ...

  7. #7
    RISOLTO!!!
    evviva!!

  8. #8
    Originariamente inviato da Vandred88
    RISOLTO!!!
    evviva!!
    ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.