2017-06-27 1 views
1

Ich habe ein Client-Skript, TCP-Paket auf IPv4-Adresse zu empfangen. Jetzt brauche ich das Skript erhält TCP-Paket auf IPv6-Adresse. Da ich nicht viel über Perl-Socket weiß, können Sie mir helfen, es zu ändern?Wie das Skript funktioniert auf IPv6-Adresse

use Socket; 
use IO::Handle; 
use constant MY_ECHO_PORT => 9067; 
$ENV{'PATH'} = "$ENV{'PATH'}:./"; 

my ($bytes_out,$bytes_in) = (0,0); 

my $dt; 

my $port = shift || MY_ECHO_PORT; 
my $protocol = getprotobyname('tcp'); 

local *SESSION; 
local *SOCK; 

$SIG{'INT'} = sub { 
    close(SESSION) if SESSION; 
    shutdown(SOCK,2) if SOCK; 
    close(SOCK) if SOCK; 
    print STDERR "Mlease agent stopped\n"; 
    exit 0; 
}; 

socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or 
    die "socket() failed: $!"; 

setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1) or 
    die "Can't set SO_REUSEADDR: $!"; 

my $my_addr = sockaddr_in($port,INADDR_ANY); 
bind(SOCK,$my_addr) or 
    die "bind() failed: $!"; 

listen(SOCK,SOMAXCONN) or 
    die "listen() failed: $!"; 

print "Mlease agent started on port $port...\n"; 
+0

[IO :: Socket :: IP] (https://metacpan.org/pod/IO::Socket::IP) unterstützt sowohl IPv4 als auch IPv6 – palik

+0

Ich habe IO :: Socket :: IP verwendet, aber es ist immer noch auf IPv4 zu hören. Ich denke, müssen etwas ändern – zalman

+0

Werfen Sie einen Blick auf [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://Stackoverflow.com/help/someone-answers) – zdim

Antwort

0

ipv6-agent.pl basierend auf IO::Socket::IP, führt Client-Befehl empfangen und sendet die Ausgabe an den Client zurück

use strict; 
use warnings; 

use IO::Socket::IP -register; 

use constant MY_ECHO_PORT => 9067; 

my $port = shift || MY_ECHO_PORT; 

my $sock = IO::Socket->new(
    Domain => PF_INET6, 
    LocalHost => "::1", 
    Listen => 1, 
    LocalPort => $port, 
    Proto  => "tcp", 
    ReuseAddr => 1, 
) or die "Cannot create socket - [email protected]\n"; 

$SIG{'INT'} = sub { 
    $sock->close() if $sock; 
    print STDERR "Mlease agent stopped\n"; 
    exit 0; 
}; 

while (1) { 
    my $client = $sock->accept(); 

    # get information about a newly connected client 
    my $client_address = $client->peerhost(); 
    my $client_port = $client->peerport(); 
    print "connection from $client_address:$client_port\n"; 

    # read up to 1024 characters from the connected client 
    my $data = ""; 
    $client->recv($data, 1024); 
    print "received data: $data\n"; 
    chomp $data; 

    my $res = qx/$data/; 
    $client->send($res); 

    # notify client that response has been sent 
    shutdown($client, 1); 
} ## end while (1) 

Ihr Skript ausführen: perl ipv6-agent.pl

betreiben einen Client : nc ::1 9067 date Wed Jun 28 08:27:20 CEST 2017

+0

Vielen Dank @palik. Der Agent hat Daten erhalten. In meinem Fall wird der Agent einen Befehl ausführen, nachdem er vom Client empfangen wurde. Beispiel: "Empfangsdaten: perl gendhcpv6 -a 1". Kannst du mir helfen, es in diesem Skript zu ändern? – zalman

+0

Wenn ich Sie richtig verstehe, müssen Sie nur den Befehl ausführen, der vom Client gesendet wird: 'qx/$ data /' – palik

+0

Ich verwendete System ("$ data"); und es hat funktioniert – zalman

Verwandte Themen