Perl Inet Socket连接澄清

时间:2015-12-02 18:15:44

标签: perl sockets client-server

我试图了解Inet Socket连接如何在perl中工作。我在下面有代码片段。

socket(my $socket, Socket::PF_INET, Socket::SOCK_STREAM, $protocol) ||
    Carp::confess "CONNECT_ERROR: Unable to create socket. $!\n";
local $SIG{ALRM} = sub { Carp::confess "Connection Timeout"; };

 eval {
            alarm(3);
            $return_val = connect( $socket, $full_address );
            alarm(0);
        }; 

以下是3种情况:

1)如果要为服务器和开放端口定义完整地址,则定义return_val的值。

2)如果应用程序尝试与同一服务器上未打开的端口进行通信,则return_val未定义。但是在这种情况下,警报未触发。

3)但是,有时尝试在开放端口上连接服务器时,会触发警报。这意味着connect语句尚未完全执行。

我对第二和第三种情况中显示的行为感到困惑。连接如何区分不响应和慢响应?理想情况下,当客户端尝试在非打开的端口进行通信时,我希望服务器不响应,这意味着连接不应该完成应该触发警报的执行。连接是否有内部超时?我搜索了它的默认值但没找到任何值。

我错过了什么吗?有人可以帮忙解释一下吗?

由于

1 个答案:

答案 0 :(得分:1)

这一切都很简单。尝试连接到没有人正在侦听特定端口的可访问服务器会快速返回失败 - 另一方很快就会通知呼叫者没有人在家,可以这么说。

但是,如果您尝试连接到无法访问的服务器或端口已打开,但此端口上的侦听器正忙于其他内容,则connect call将阻止并等待直至尝试达到服务器超时或另一方的听众接听电话。在这种情况下,您的警报会触发,并且您的值未定义 - 因为连接未在3秒内完成。

我希望,现在很清楚。