Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема записи хэндлов в глоабальный хэш ? помогите решить проблему 
V
    Опции темы
gcc
Дата 25.3.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Код

use Data::Dumper;
print Dumper  \%clients;


может надо посмотреть... дайте вывод
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 25.3.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



zerg13new, *client{IO} у Вас undef потому, что для сокета Вы используете лексическую переменную, а указанная конструкция работает только с динамическими (т.е. глобальными переменными).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ramus
Дата 25.3.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

Репутация: 1
Всего: 1



Вы не читали книгу "Разработка сетевых программ на PERL" Линкольн Д.Штайн ?
В этой книге подробно рассматриваются все аспекты написания сервера (включая неблокирующийся ввод-вывод и демонизацию).
Очень рекомендую. Почерпнете очень многое. Она у меня есть как в бумажном виде так и в электронном. Весит 20МБ. Могу выслать куда нибудь...
PM MAIL   Вверх
zerg13new
Дата 26.3.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.3.2010

Репутация: нет
Всего: нет



пока кода ввода в маси и вывода выглядит так
   $clients{ "$client_ip:$client_port" } = *client{IO}; # add new socket to %client
   syswrite( $clients{"$client_ip:$client_port"}, "hi, how are you??") || die ":$! _ $@";

gcc
Can't use an undefined value as a symbol reference at server.pl line 50, <STDIN> line 1.
HASH(0x8a923f8)Perl exited with active threads:

ginnie
я на сайтах читал, что так получают. примеры были таковы
$scalarref = *s{SCALAR}; # Ссылка на скалярную переменную
$arrayref  = *s{ARRAY};  # Ссылка на массив скаляров
$hashref   = *s{HASH};   # Ссылка на ассоциативный массив
$coderef   = *s{CODE};   # Ссылка на подпрограмму
$ioref     = *s{IO};     # Ссылка на дескриптор файла, сокета
$globref   = *s{GLOB};   # Ссылка на все запись
не спорю что я могу неправильно потом их вытаскивать, но я уже как только не пробую  smile  если подскажите как лучше, я только буду рад

ramus
вот с неё то и начинал, причём примеры те кот он приводит с глоабыльными переменными уже не работают,потому как с версии 5.6 или более поздней глобальные переменные не разделяются просто так, для этого нужны спец модули... вот потому пришлось отказаться от этой книги, хотя как основу я её прочёл одну из первых для сетевого взаимодействия
так же я прочёл/пролистал:
Ellie Quigley - Perl by Example
Lincoln D Stein - network programming with Perl
Холзнер - Perl Специальный справочник 2001
PM MAIL   Вверх
ginnie
Дата 26.3.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



zerg13new, поясню свою мысль:

Код

$coderef   = *s{CODE};


правильно работает для глобальной переменной $s

Код

our $s;


У Вас в коде используется лексическая переменная $client

Код

while( my $client = $server -> accept ) {



а здесь уже используется глобальная переменная $client (угадайте, что записано в таблице символов для client в файловом дескрипторе - undef)
Код

$clients{ "$client_ip:$client_port" } = *client{IO};


Теперь я понятно объяснил (сомневаюсь :о)?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ginnie
Дата 26.3.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



По поводу конкретных советов: наиболее верным мне видится вариант из первого сообщения, похоже проблема в том, что неявный файловый дескриптор $client неразделяемый (not shared). Можно попробовать сделать его разделяемым при помощи share($client). Сработает такой вариант или нет - не знаю, особенно учитывая что в описании ни слова о indirect filehandles
Цитата

Тhis module supports the sharing of the following data types only: scalars and scalar refs, arrays and array refs, and hashes and hash refs.


Других вариантов с разделением между потоками набора неявных файловых дескрипторов я пока придумать не смог.

Это сообщение отредактировал(а) ginnie - 26.3.2010, 13:35


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
DurRandir
Дата 26.3.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



А, мне тут пришла в голову идея. Раз уже вам очень-очень хочется это сделать на потоках, то передавайте в поток fileno($handle), а в принимающем потоке воссоздавайте объект через new_from_fd (метод из IO::Handle). Но если это под win - то надо проверять работоспособность. 

Это сообщение отредактировал(а) DurRandir - 26.3.2010, 13:58
PM   Вверх
zerg13new
Дата 26.3.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.3.2010

Репутация: нет
Всего: нет



ginnie
спасибо, всё ясно о чём вы  smile  заодно и вспомнил по этой статье эту тематику переменные perl . Спасибо.

DurRandir
почитаем о реализации такой идеи и если ничего не выйдет с более вышестоящим советом, то обязательно попробуем, спасибо
PM MAIL   Вверх
zerg13new
Дата 3.4.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.3.2010

Репутация: нет
Всего: нет



Проблема решена, но лично у меня только в Linux (debian ) на perl v 5.10.0:
Первоисточник, где я общался по поводу проблемы, как использовать массив хэндлов между потоками в сервере по обмена сообщениями из консоли здесь: решение проблемы на perlmonks.org
В кратце суть решения проблемы такова оказалась:

## В ОСНОВНОМ потоке вот так записываем хэндлы в хэш
while( my $client = $server -> accept ) {
       ##
        $clients{ "$client_ip:$client_port" } = fileno( $client );  ## здесь кладём в хэш хэндл сокета (точнее некий его заменитель, число)
       ##
}

В ДОЧЕРНЕМ потоке, которому надо работать с этими хэндлами из этого хэша:
 my $client;
 my $fileno = $clients{$clnt_ip_port};
 open $client, "+<&$fileno" || die "$!\n


ВСЁ народ, всем ОГРОМНОЕ спасибо за то что живо отреагировали на мои проблемы и дали дельные советы. Вы мне помогли очень-очень. Именно за такие сообщества я и обожаю инет  smile 

Это сообщение отредактировал(а) zerg13new - 3.4.2010, 17:22
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0922 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.