Perl: перенаправление двух сокетов друг в друга

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