【问题标题】:Want to send UDP packet over IPv6 link local IP in Perl想要在 Perl 中通过 IPv6 链接本地 IP 发送 UDP 数据包
【发布时间】:2015-08-17 13:01:22
【问题描述】:

我编写了一个脚本来通过 IPv6 链接本地 IP 发送 UDP 数据包。 源和目标都是 IPv6 链路本地 IP。

#!/usr/bin/perl
use IO::Socket::INET6;
use Socket6;

my ($socket,$data);

$socket = new IO::Socket::INET6(
    LocalAddr   => 'fe80::21b:21ff:fe39:8cce',
    LocalPort   => '547',
    PeerAddr   => 'fe80::240:43ff:feb9:2f44',
    PeerPort   => '546',
    Proto        => 'udp',
) or die "ERROR in Socket Creation : $@\n";

for (my $i=1; $i <= 1; $i++) {
    $data =pack('H*',"123455550");

    $socket->send($data);

}

$socket->close();

执行上述脚本后,出现以下错误:

ERROR in Socket Creation : IO::Socket::INET6: bind: Invalid argument

请任何人帮助我。

【问题讨论】:

  • 您是否以root 的身份运行它?否则你应该选择 1024 以上的non-privileged port

标签: perl sockets ipv6


【解决方案1】:

我感觉这是失败的,因为您使用的是本地链接,但不要在 LocalAddr 字符串中指定接口。以下似乎对我有用:

LocalAddr  => "fe80::a00:27ff:fe49:51ce%eth0",
PeerAddr   => "fe80::a00:27ff:fe49:51ce",
PeerPort   => 22,
Proto      => 'tcp',

【讨论】:

  • 我在文档中没有看到任何关于此的内容,但如果其他人可以确认此行为,我将很高兴为文档编写补丁。
  • 因为所有接口上的链路本地网络都使用同一个网络(fe80::/10),所以在使用链路本地地址时必须指定区域(接口)。如果您有多个接口,则每个接口都将使用链路本地网络,因此操作系统必须确定要使用哪个接口的唯一方法是在地址末尾使用区域指定。不同的操作系统具有不同的区域标识符(%eth0、%2 等)。
【解决方案2】:

您也不想使用Socket6IO::Socket::INET6,因为这两者都是非常古老的“过渡”内容,早在核心的Socket 原生支持'v6 之前就在IPv6 中编写。现在它做得很好,你应该坚持常规的SocketIO::Socket::IP

(通过免责声明:我是两者的维护者)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多