URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6542
[ Назад ]

Исходное сообщение
"Копирование дескрипторов (сокетов)"

Отправлено 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 , 15-Июн-07 09:34 
Через скаляр работает:
$SOCK = *CLIENT;
$s = <$SOCK>;

Но я хотел бы использовать массив:
$SOCK[0] = *CLIENT;
$s = <$SOCK[0]>;
И это уже не прокатывает

В чем косяк?


"Копирование дескрипторов (сокетов)"
Отправлено andy , 15-Июн-07 11:05 
Думал, что подойдет т.н. "косвенная объектная запись", как в print`e:

print { $condition ? $sock[0] : $sock[1] } "string";
т.е.
$s = < {$sock[0]} >

не прошло. Единственно, что пришло в голову после перлдока, это

$s = readline( $sock[0] );


"Копирование дескрипторов (сокетов)"
Отправлено ForceMan , 15-Июн-07 11:57 
>Думал, что подойдет т.н. "косвенная объектная запись", как в 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 , 15-Июн-07 14:58 
>Все решилось, реализовал следующим образом:
>
>       accept($SOCK[0], SERVER)
>       $s = $SOCK[0];
>       my $data = <$s>;
Ну у тебя и так все получилось, но все равно вот примерчик(так на всякий случай) работы с массивом указателей на файлы(сокеты аналогично). могу аналогичный привести с хешем.
#!/usr/bin/perl -w

use 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);
}