【问题标题】:AnyEvent::Socket and abstract UNIX socketAnyEvent::Socket 和抽象 UNIX 套接字
【发布时间】:2015-04-29 21:37:11
【问题描述】:

有了 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.

如何在 Anyevent::Socket 中使用抽象 UNIX 套接字?

【问题讨论】:

    标签: perl anyevent


    【解决方案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,希望他接受补丁
    • 猴子补丁功能
    • 实现您自己的支持抽象域套接字的模块

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 2013-10-08
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多