#perl #sockets #redirect
#perl #сокеты #перенаправление
Вопрос:
Вот что я хочу сделать:
- создайте два сокета S1 и S2
- перенаправить вывод S1 на вход S2
- перенаправить вывод S2 на вход S1
В C я бы посмотрел где-нибудь вокруг «dup2» и других, но я действительно не знаю, как я могу сделать это в Perl.
Ответ №1:
Посмотрите документацию для open()
— все функциональные возможности dup()
могут быть выполнены с open
помощью — например:
open(my $fh2, '<amp;=', $fh1); # makes $fh2 a dup of file handle $fh1
С другой стороны, я думаю, вы можете достичь своей цели, проводя различие между дескрипторами чтения и дескрипторами записи. Т. Е. в вашем коде не используйте один и тот же дескриптор сокета как для чтения, так и для записи — используйте разные переменные / члены экземпляра / параметры, чтобы указать дескриптор чтения и дескриптор записи. Пример — вместо:
sub foo {
my ($sock) = @_;
my $x = <$sock>;
...
print {$sock} ...;
}
напишите свой код следующим образом:
sub foo {
my ($rh, $wh) = @_;
my $x = <$rh>; # use $rh for reading
...
print {$wh} ...; # use $wh for writing
}
Затем, если вы действительно можете использовать один и тот же сокет, вы вызываете foo
с foo($sock, $sock)
помощью.
Однако, если вы хотите использовать два разных сокета, то вы можете сделать это с помощью foo($s1, $s2)
.