如何使用IO :: Socket :: SSL获取我自己的服务器IP地址

时间:2019-01-18 05:52:47

标签: perl websocket

我需要在Perl中发布本地客户端以进行内部连接监视,例如(不截取现有服务器的单独客户端):

my $srv_ip=????; # I know my server IP address, but this is general and may change, I want this to be taken programmatically somehow.
my $cl=IO::Socket::SSL->new($srv_ip:$Port);

1)我在使用Net :: Websocket :: Server的开放式Websocket服务器中,但是在阅读他们的规格时,我没有找到如何获取服务器IP地址的方法,我认为应该有一种更简单的方法(也许从%ENV,但我不确定这种方法在每个OS中是否都可以-至少在Linux系统上应该是可移植的)。 2)我也使用IO :: Socket :: SSL:

打开的服务器连接侦听器
my @crt=&SSLCerts(); die 'E101' if(@crt==0);
my $ssl=IO::Socket::SSL->new(
    Listen        => 10000,
    Timeout       => 45,
    LocalPort     => $Port,
    Proto         => 'tcp',
    SSL_cert_file => "$EF::Base/$crt[0][0].crt",
    SSL_key_file  => "$EF::Base/$crt[1][0].key"
) or die "E102: $!";

但是在他们的规格中,我也没有找到我可以使用的服务器IP地址变量。

3)请注意,相同的pl程序适用于许多系统,每个系统及其端口。尽管它们共享相同的主机,但是从客户端登录时输入的是地址,而不是保留在任何变量中(这可能会有帮助,但是我认为必须有一种简单的方法可以从%ENV中获取它)。

我应该在$ srv_ip中输入什么才能使其正常工作?

非常感谢

1 个答案:

答案 0 :(得分:2)

在IO :: Socket上使用sockaddr()方法

use strict;
use warnings;

use IO::Socket::INET;

my $socket = IO::Socket::INET->new(
    PeerAddr => 'localhost:3306'
) or die "$!\n";

print inet_ntoa($socket->sockaddr()), "\n";

示例输出:

$ perl dummy.pl
127.0.0.1

编辑:请注意,必须在客户端接受的套接字上使用sockaddr,而不是侦听套接字。在侦听套接字上,您只会看到它绑定到的地址,可能是IN_ADDR_ANY(AKA 0.0.0.0)。