我试图在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不支持自动对焦,但这只是给出了一个不同的错误。任何人都可以给我一个线索,该怎么做?
1条答案
按热度按时间vxbzzdmp1#
在WSL2下,你可能会发现你的主目录或工作目录Map到类似
/mnt/c/Users/username
的文件系统,这是一个Windows文件系统而不是Linux文件系统,Windows文件系统不支持AF_UNIX
套接字,因此如果你试图创建一个套接字,它会失败。解决方案是把你的工作开发目录移到linux文件系统中,比如
/home
下。完成后你可以创建AF_UNIX
套接字。但是,这个文件系统不能Map到Windows,所以不能被Windows托管的IDE直接访问,比如VSCode,它把整个WSL2作为一个开发环境,对于这种事情有点无用。