2017-06-27 6 views
1

私はIPv4アドレスでTCPパケットを受信するクライアントスクリプトを持っています。 これで、スクリプトはIPv6アドレスでTCPパケットを受信する必要があります。 私はperl-Socketについてよく知らないので、変更を手伝ってもらえますか? IO::Socket::IPをもとにIPv6アドレスでスクリプトを動作させる方法

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)はIPv4とIPv6の両方をサポートしています – palik

+0

私はIO :: Socket :: IPを使っていましたが、まだIPv4でリッスンしています。私は何かを変更する必要があると思う – zalman

+0

[誰かが私の質問に答えるときに私は何をすべきですか?](http://stackoverflow.com/help/someone-answers) – zdim

答えて

0

ipv6-agent.pl、受信したクライアントコマンドを実行し、スクリプトを実行

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) 

てクライアントに出力を送信します。 perl ipv6-agent.pl

クライアントを実行: nc ::1 9067 date Wed Jun 28 08:27:20 CEST 2017

+0

ありがとう@palik。エージェントはデータを受信しました。私の場合、エージェントはクライアントから受信した後にコマンドを実行します。例:「受信データ:perl gendhcpv6 -a 1」。あなたは私がこのスクリプトでそれを変更するのを助けることができますか? – zalman

+0

私が正しく理解したら、クライアントから送られたコマンドを実行するだけです。 'qx/$ data /' – palik

+0

私はsystem( "$ data")を使いました。それは働いている – zalman

関連する問題