gpt4 book ai didi

perl - 为什么我从对 IO::Socket::INET->peerhost 的调用中得到一个空字符串?

转载 作者:行者123 更新时间:2023-12-04 22:51:44 24 4
gpt4 key购买 nike

我正在编写一个小脚本来监视是否尝试使用 Perl 5.10.1 在我的 Linux 机器(Centos 6)上访问某些端口。我正在为我的 peerhost 请求取回空白条目。我不确定为什么。听起来这可能是 IO 套接字模块(http://snowhare.com/utilities/perldoc2tree/example/IO/Socket.html)中的故障,但我不太确定。任何见解将不胜感激。

编辑:

由于我启用了严格和警告,在我认为它是空白的情况下,我得到了一个“未初始化的值 $display”。

#! /usr/bin/perl
use strict;
use warnings;

use IO::Socket;
use Sys::Syslog qw( :DEFAULT setlogsock);
use threads;

my @threads=();
my @ports=(88,110,389);

main(\@ports);

sub main
{
my $ports=shift;
setlogsock('unix');
openlog($0,'','user');
for my $port (@{$ports} ) {
push @threads, threads->create(\&create_monitor, $port );
}
$_->join foreach @threads;
closelog;
# wait for all threads to finish
}


sub create_monitor{
my $LocalPort=shift;

my $sock = new IO::Socket::INET (
LocalPort => $LocalPort,
Proto => 'tcp',
Listen => 1,
Reuse => 1,
) or die "Could not create socket: $!\n";


while(1)
{
my $peer_connection= $sock->accept;
my $display = $peer_connection->peerhost();
my $message="Connection attempt on port $LocalPort from $display";
#syslog('info', $message);
print $message."\n";
}

}

注意 - 这个脚本永远不会完成是故意的。我最终会用一个初始化脚本来包装它,让它作为服务运行。

最佳答案

Perl accept()像大多数其他函数一样有一个错误代码。对于 accept()这是一个错误的返回,另见here .

因此,当您得到未定义结果时,accept() 中会出现错误。称呼。 accept 的错误保存在 errno 变量($!)中。
peerhost() 也是如此(见 here)。它也可能失败并返回错误代码。

如果您只使用上面的代码而没有其他任何东西,那么您可能在 accept() 时达到了系统的连接限制(您应该关闭连接)。失败。见 rlimit()找出如何增加这个数字。

一种情况,peerhost()失败可能是远程连接已经关闭。

关于perl - 为什么我从对 IO::Socket::INET->peerhost 的调用中得到一个空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com