The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Копирование дескрипторов (сокетов)"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Копирование дескрипторов (сокетов)"  
Сообщение от ForceMan (??) on 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>;


Надеюсь на вашу помощь!!!!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Копирование дескрипторов (сокетов)"  
Сообщение от ForceMan (??) on 15-Июн-07, 09:34 
Через скаляр работает:
$SOCK = *CLIENT;
$s = <$SOCK>;

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

В чем косяк?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Копирование дескрипторов (сокетов)"  
Сообщение от ForceMan (??) on 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>;

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Копирование дескрипторов (сокетов)"  
Сообщение от NuINu (??) on 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);
}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру