Копирование дескрипторов (сокетов), ForceMan, 15-Июн-07, 09:09 [смотреть все]Приветсвую всех! Хотел спросить у ГУРУ: каким образом на Perl можно организовать копирование дескрипторов (сокетов)? Суть такая, что есть 2 программы: первая работает в качестве демона и слушает определенный порт, на который поступают команды от второй программы на установку соединения с нужным сервисом (IP+port). Вторая программа после отправки команды и получения ответа разрывает связь с первой, но первая программа продолжает поддерживать установленные соединения с сервисами. В качестве ответа во вторую программу передается ID канала (выбирается произвольно), и если вторая хочет отправить первой дополнительную команду на сервис, с которым уже было установлено соединение, она отправляет его на соответсвующий ID: для этого в первой проге создается массив сокетов: @SOCK;while (accept(CLIENT, SERVER)) { # do something with CLIENT } Каким образом можно скопировать дескриптор сокета CLIENT в $SOCK[0]? B как его потом использовать в коде вида $f = <CLIENT>; Надеюсь на вашу помощь!!!!
|
- Копирование дескрипторов (сокетов), ForceMan, 09:34 , 15-Июн-07 (1)
Через скаляр работает: $SOCK = *CLIENT; $s = <$SOCK>;Но я хотел бы использовать массив: $SOCK[0] = *CLIENT; $s = <$SOCK[0]>; И это уже не прокатывает В чем косяк?
- Копирование дескрипторов (сокетов), andy, 11:05 , 15-Июн-07 (2)
Думал, что подойдет т.н. "косвенная объектная запись", как в print`e:print { $condition ? $sock[0] : $sock[1] } "string"; т.е. $s = < {$sock[0]} > не прошло. Единственно, что пришло в голову после перлдока, это $s = readline( $sock[0] );
- Копирование дескрипторов (сокетов), ForceMan, 11:57 , 15-Июн-07 (3)
>Думал, что подойдет т.н. "косвенная объектная запись", как в 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>;
- Копирование дескрипторов (сокетов), NuINu, 14:58 , 15-Июн-07 (4)
>Все решилось, реализовал следующим образом: > > 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); }
|