Ключевые слова:perl, socket, (найти похожие документы)
Date: Tue, 03 Apr 2001 10:27:09 +0400
From: Stas Vlasov <[email protected]>
Newsgroups: fido7.ru.unix
Subject: использование в perl функции dup2
LS>>> if (STDIN_FILENO != dup2(STDIN_FILENO,clsock)) my_error_handler();
LS>>> if (STDOUT_FILENO != dup2(STDOUT_FILENO,clsock)) my_error_handler();
LS>>> if (clsock != STDIN_FILENO && clsock != STDOUT_FILENO)
SV>> Хм. Одно из двух, либо перл слабо подходит для этого, либо я не умею читать.
SV>> Hо dup2 в перле отсутствует.
EBB> Присутствует неявно. Читать надо "perldoc -f open" и "man perlipc".
EBB> Там конструкции даже удобнее, чем возня с дупами. :)
Поздно :-)
Уже начал с дупами.
Вот что у меня вышло:
#!/usr/bin/perl
use IO::Socket;
use POSIX;
$server_port = 58100;
$server = IO::Socket::INET->new(LocalPort => $server_port,
Type => SOCK_STREAM,
Reuse => 1,
Listen => 10 )
or die "Couldn't be a tcp server on port $server_port :$@\n";
while ($client = $server->accept()) {
if ($client < 0) {
printf "Socket error!\n";
next;
}
$addr = $client->peerhost();
if (($addr =~ /^192\.168\.47\./) || ($addr =~ /127.0.0.1/)) {
$pid = fork();
if ($pid < 0) { printf "Can't fork!\n" };
if ($pid == 0) {
close STDIN;
close STDOUT;
close STDERR;
dup2(STDIN, $client);
dup2(STDOUT, $client);
if (!(STDIN == $client) && !(STDOUT == $client)) {
close $client;
}
exec ("./ftp-gw");
exit();
} else {
close $client;
}
} else {
close $client;
}
}
close($server);
При этом, ftp-gw (настроенный, отдельно работает) сообщает мне
getpeername: Socket operation on non-socket
--
Стас. stas%[email protected]