【问题标题】:Perl IO::Socket::INETPerl IO::Socket::INET
【发布时间】:2016-04-14 19:49:17
【问题描述】:
#!/usr/bin/perl

use warnings; use strict;

use IO::Socket::INET;

our $local_host = "0.0.0.0";
our $local_port = "14267";


$SIG{'CHLD'} = 'IGNORE';
my $bind = IO::Socket::INET->new(
                        Listen=>5,
                        LocalAddr=>$local_host.':'.$local_port,
                        ReuseAddr=>1) 
                        or die print('Could not bind: ' .$local_host.':'.$local_port);

当我尝试从终端执行此代码时,它可以工作,但是当我尝试从浏览器执行它时,它返回无法绑定等。

谁能给我解释一下问题是什么?我认为这与用户权限无关。

【问题讨论】:

  • 您到底希望这做什么?在终端中“它有效”是什么意思?你是怎么从浏览器调用这个的?
  • $ perl test.pl 从终端它可以工作。从浏览器我尝试通过 exec() shell_exec() syste() 之类的 php 函数执行它。
  • "could not bind etc etc...." - $!(即$ERRNO)应该包含有关该问题的更多详细信息。请将其添加到您的代码中,并将输出添加到您的问题中。

标签: perl


【解决方案1】:

你怎么可能知道它不能绑定?无论发生什么错误,您总是会记录“无法绑定”!更重要的是,您不会记录发生了什么错误!第一步是纠正它。

#!/usr/bin/perl

use warnings; use strict;

use IO::Socket::INET;

my $local_port = 14267;

my $server_socket = IO::Socket::INET->new(
   LocalPort => $local_port,
   Listen    => 5,
   ReuseAddr => 1,
)
   or die("Can't create server socket: $@");    # <-- The relevant change.

我怀疑你会因为像 SElinux 这样的安全框架而遇到某种权限错误。

【讨论】:

  • 对于好奇的人,$@(通常用于最后一个eval的错误信息)不是错字;这就是 IO::* 系列中的模块通常报告错误的地方。这很令人困惑,但would be difficult to change at this point.
  • 我解决了,谢谢,因为我记录了错误,我有权限问题。
  • 我不确定如何判断它是 SELinux 还是其他东西。如果是 SELinux,有办法告诉它允许创建套接字。谷歌搜索应该很容易找到这个。
猜你喜欢
  • 2023-04-03
  • 2012-03-08
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
相关资源
最近更新 更多