The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Копирование дескрипторов (сокетов), !*! 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 -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);
          }





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

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