Как получить IP-адрес моего собственного сервера с помощью IO :: Socket :: SSL - PullRequest
0 голосов
/ 18 января 2019

Мне нужно выдать локальный клиент в 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, но, читая их спецификации, я не нашел, как получить IP-адрес моего сервера, и я думаю, что будет гораздо более простой способ (возможно, из % ENV, но я не уверен, что этот подход будет приемлем в каждой ОС - он должен быть переносимым, по крайней мере, для систем 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 голосов
/ 18 января 2019

Использование метода sockaddr() в IO :: Socket:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...