Приветсвую всех!
Хотел спросить у ГУРУ: каким образом на Perl можно организовать копирование дескрипторов (сокетов)? Суть такая, что есть 2 программы: первая работает в качестве демона и слушает определенный порт, на который поступают команды от второй программы на установку соединения с нужным сервисом (IP+port). Вторая программа после отправки команды и получения ответа разрывает связь с первой, но первая программа продолжает поддерживать установленные соединения с сервисами. В качестве ответа во вторую программу передается ID канала (выбирается произвольно), и если вторая хочет отправить первой дополнительную команду на сервис, с которым уже было установлено соединение, она отправляет его на соответсвующий ID:
для этого в первой проге создается массив сокетов:
@SOCK;while (accept(CLIENT, SERVER)) {
# do something with CLIENT
}Каким образом можно скопировать дескриптор сокета CLIENT в $SOCK[0]? B как его потом использовать в коде вида $f = <CLIENT>;
Надеюсь на вашу помощь!!!!
Через скаляр работает:
$SOCK = *CLIENT;
$s = <$SOCK>;Но я хотел бы использовать массив:
$SOCK[0] = *CLIENT;
$s = <$SOCK[0]>;
И это уже не прокатываетВ чем косяк?
Думал, что подойдет т.н. "косвенная объектная запись", как в print`e:print { $condition ? $sock[0] : $sock[1] } "string";
т.е.
$s = < {$sock[0]} >не прошло. Единственно, что пришло в голову после перлдока, это
$s = readline( $sock[0] );
>Думал, что подойдет т.н. "косвенная объектная запись", как в print`e:
>
>print { $condition ? $sock[0] : $sock[1] } "string";
>т.е.
>$s = < {$sock[0]} >
>
>не прошло. Единственно, что пришло в голову после перлдока, это
>
>$s = readline( $sock[0] );Все решилось, реализовал следующим образом:
accept($SOCK[0], SERVER)
$s = $SOCK[0];
my $data = <$s>;
>Все решилось, реализовал следующим образом:
>
> accept($SOCK[0], SERVER)
> $s = $SOCK[0];
> my $data = <$s>;
Ну у тебя и так все получилось, но все равно вот примерчик(так на всякий случай) работы с массивом указателей на файлы(сокеты аналогично). могу аналогичный привести с хешем.
#!/usr/bin/perl -wuse strict;
my @descr_file;
my @name = ('a1', 'a2', 'a3', 'a4');
#Запишем
my $descr;
my $name;
foreach $name (@name) {
open($descr, '>', $name);
if(defined($descr)) {
print "open: ".$name."\n";
push(@descr_file, $descr);
}
#попробуй убрать :-) и все будет писаться в один файл (последний открытый).
undef $descr;
}my $i = 0;
foreach $descr (@descr_file) {
print "write to $descr\n";
$i++;
print $descr "Sequence write $i\n";
}
print "close all file\n";
foreach $descr (@descr_file) {
close($descr);
}undef @descr_file;
#Читаем
foreach $name (@name) {
open($descr, '<', $name);
if(defined($descr)) {
print "open: ".$name."\n";
push(@descr_file, $descr);
}
undef $descr;
}my $str;
foreach $descr (@descr_file) {
print "read from $descr\n";
$str = <$descr>;
print "I read: $str\n";
}
print "close all file\n";
foreach $descr (@descr_file) {
close($descr);
}