AnyEvent :: Socket和抽象的UNIX套接字

时间:2015-01-11 15:44:54

标签: perl anyevent

使用Socket我可以使用:

socket(my $socket, AF_UNIX, SOCK_STREAM, 0)
    or die "socket: $!";
my $sock_addr = sockaddr_un(chr(0).'/abstract/socket');
connect($socket, $sock_addr)  or die "connect: $!";
一切都好。我连接并可以发送/接收;

使用AnyEvent :: Socket:

tcp_connect "unix/",chr(0).'/abstract/socket' , sub {
    my ($fh) = @_
        or die "unable to connect: $!";
    ...
}

并收到错误:unable to connect: No such device or address at file.pl line X.

如何将抽象UNIX套接字与Anyevent :: Socket一起使用?

1 个答案:

答案 0 :(得分:1)

嗨,我稍微挖了一下,简短的回答是AnyEvent :: Socket不支持抽象套接字。

更长的答案是,它确实应该,并且据我所知,它有一个小的疏忽,阻止它工作。

resolve_sockaddr是罪魁祸首,我的版本中的第718行:

   if ($node eq "unix/") {
      return $cb->() if $family || $service !~ /^\//; # no can do

      return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]);
   }

读取$service !~ /^\//; # no can do的行的部分是妨碍它工作的部分。

在我的情况下,我只是注释掉了这一行,并且它有效,但实际上应该修改正则表达式以允许前面的\0表示抽象套接字路径。

您有几个选择:

  • 修改图书馆的本地副本
  • 将更改上游推向Marc Lehmann并希望他接受补丁
  • Monkey补丁功能
  • 实现您自己的支持抽象域套接字的模块
祝你好运。