Я пытаюсь передать открытое соединение сокетов TCP из программы Perl в качестве stdin и stdout во внешнее приложение в Windows, похожее на то, что inetd в мире Unix.Как передать открытый TCP-сокет из Perl в приложение Windows в качестве stdin и stdout
То, что я пробовал:
"Заменить" стандартный ввод и стандартный вывод в гнездо с помощью
open
илиPOSIX::dup2
и вызова Exec:# $socket is an open TCP socket open STDIN, '<&', $socket or die "Unable to dup stdin: $^E"; open STDOUT, '>&', $socket or die "Unable to dup stdout: $^E"; close $socket; exec($program) or die "Unable to exec $command: $^E";
Используйте
IPC::open3
:my $pid = open3( '>&'.$socket->fileno, '<&'.$socket->fileno, '<&'.fileno(STDERR), $program); waitpid $pid, 0;
В обоих случаях исполняемая программа получает что-то, что не является сокетом (возможно, трубой?), Что является проблемой, потому что он хочет использовать select
. В Windows select
работает только на сокетах.
Что делать, чтобы передать сокет внешнему приложению?
Кстати, я использую Strawberry Perl, а не ActiveState.
Спасибо, похоже, что передача сокета с использованием 'WSADuplicateSocket' является единственной реальной опцией. – Joni