perl 不支持WSL2 Debian套接字操作

fnatzsnv  于 2023-01-13  发布在  Perl
关注(0)|答案(1)|浏览(111)

我试图在WSL 2中的Debian上从Perl打开一个套接字,它给了我一个不支持的操作,而在VMWare VM中的Debian上则很好。
来自我的应用程序的诊断如下所示:
在Debian 5.15.79.1-微软标准-WSL 2 #1 SMP Wed Nov 23 01:01:46 UTC 2022 x86_64上,它执行以下操作:

init_sockets...
  127.0.0.1:9996 => TH::accept_ftp_dat_session
  [::1]:9996 => TH::accept_ftp_dat_session
  127.0.0.1:4203 => TH::accept_ftp_cmd_session
  [::1]:4203 => TH::accept_ftp_cmd_session
  127.0.0.1:4200 => TH::accept_telnet_session
  [::1]:4200 => TH::accept_telnet_session
  127.0.0.1:4201 => TH::accept_telnet_session
  [::1]:4201 => TH::accept_telnet_session
  127.0.0.1:7979 => TH::accept_finger_session
  [::1]:7979 => TH::accept_finger_session
  127.0.0.1:4202 => TH::accept_telnet_session
  [::1]:4202 => TH::accept_telnet_session
  www-data/http.socket => TH::accept_http_session
Operation not supported at ./src/th_networking.pm line 1033.

在虚拟机上运行Debian 5.10.149-2(2022年10月21日)x86_64时,它会执行以下操作:

init_sockets...
  127.0.0.1:4200 => TH::accept_telnet_session
  [::1]:4200 => TH::accept_telnet_session
  127.0.0.1:9996 => TH::accept_ftp_dat_session
  [::1]:9996 => TH::accept_ftp_dat_session
  127.0.0.1:4203 => TH::accept_ftp_cmd_session
  [::1]:4203 => TH::accept_ftp_cmd_session
  127.0.0.1:7979 => TH::accept_finger_session
  [::1]:7979 => TH::accept_finger_session
  127.0.0.1:4201 => TH::accept_telnet_session
  [::1]:4201 => TH::accept_telnet_session
  127.0.0.1:4202 => TH::accept_telnet_session
  [::1]:4202 => TH::accept_telnet_session
  www-data/http.socket => TH::accept_http_session
  proxied.socket => TH::accept_proxied_session

相关代码为:

sub init_socket
{
    my ( $sockaddr ) = @_;

    my $family = sockaddr_family($sockaddr);
    my $socket;

    if ( $family == &AF_UNIX )
    {
        socket $socket, $family, &SOCK_STREAM, &IPPROTO_IP or die $!;
    }
    else
    {
        socket $socket, $family, &SOCK_STREAM, &IPPROTO_TCP or die $!;
        setsockopt $socket, &SOL_SOCKET, &SO_REUSEADDR, 1 or die $!;
        setsockopt $socket, &SOL_SOCKET, &SO_LINGER, pack( 'ii', 1, 0 ) or die $!;
        setsockopt $socket, &IPPROTO_IPV6, &IPV6_V6ONLY, 1 or die $! if $family == &AF_INET6;
    }

    fcntl $socket, &F_SETFL, &O_NONBLOCK or die $!;
    bind $socket, $sockaddr or die $!;
    listen $socket, 5 or die $!;

    return $socket;
}

它在上面的bind $socket, $sockaddr or die $!;行失败。
我试过wsl 1和wsl 2,因为我读到wsl 2不支持自动对焦,但这只是给出了一个不同的错误。任何人都可以给我一个线索,该怎么做?

vxbzzdmp

vxbzzdmp1#

在WSL2下,你可能会发现你的主目录或工作目录Map到类似/mnt/c/Users/username的文件系统,这是一个Windows文件系统而不是Linux文件系统,Windows文件系统不支持AF_UNIX套接字,因此如果你试图创建一个套接字,它会失败。
解决方案是把你的工作开发目录移到linux文件系统中,比如/home下。完成后你可以创建AF_UNIX套接字。但是,这个文件系统不能Map到Windows,所以不能被Windows托管的IDE直接访问,比如VSCode,它把整个WSL2作为一个开发环境,对于这种事情有点无用。

相关问题