![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
может надо посмотреть... дайте вывод |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
zerg13new, *client{IO} у Вас undef потому, что для сокета Вы используете лексическую переменную, а указанная конструкция работает только с динамическими (т.е. глобальными переменными).
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
ramus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 21.2.2008 Репутация: 1 Всего: 1 |
Вы не читали книгу "Разработка сетевых программ на PERL" Линкольн Д.Штайн ?
В этой книге подробно рассматриваются все аспекты написания сервера (включая неблокирующийся ввод-вывод и демонизацию). Очень рекомендую. Почерпнете очень многое. Она у меня есть как в бумажном виде так и в электронном. Весит 20МБ. Могу выслать куда нибудь... |
|||
|
||||
zerg13new |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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}; # Ссылка на все запись не спорю что я могу неправильно потом их вытаскивать, но я уже как только не пробую ![]() ramus, вот с неё то и начинал, причём примеры те кот он приводит с глоабыльными переменными уже не работают,потому как с версии 5.6 или более поздней глобальные переменные не разделяются просто так, для этого нужны спец модули... вот потому пришлось отказаться от этой книги, хотя как основу я её прочёл одну из первых для сетевого взаимодействия так же я прочёл/пролистал: Ellie Quigley - Perl by Example Lincoln D Stein - network programming with Perl Холзнер - Perl Специальный справочник 2001 |
|||
|
||||
ginnie |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
zerg13new, поясню свою мысль:
правильно работает для глобальной переменной $s
У Вас в коде используется лексическая переменная $client
а здесь уже используется глобальная переменная $client (угадайте, что записано в таблице символов для client в файловом дескрипторе - undef)
Теперь я понятно объяснил (сомневаюсь :о)? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||||
|
|||||||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
По поводу конкретных советов: наиболее верным мне видится вариант из первого сообщения, похоже проблема в том, что неявный файловый дескриптор $client неразделяемый (not shared). Можно попробовать сделать его разделяемым при помощи share($client). Сработает такой вариант или нет - не знаю, особенно учитывая что в описании ни слова о indirect filehandles
Других вариантов с разделением между потоками набора неявных файловых дескрипторов я пока придумать не смог. Это сообщение отредактировал(а) ginnie - 26.3.2010, 13:35 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
А, мне тут пришла в голову идея. Раз уже вам очень-очень хочется это сделать на потоках, то передавайте в поток fileno($handle), а в принимающем потоке воссоздавайте объект через new_from_fd (метод из IO::Handle). Но если это под win - то надо проверять работоспособность.
Это сообщение отредактировал(а) DurRandir - 26.3.2010, 13:58 |
|||
|
||||
zerg13new |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 25.3.2010 Репутация: нет Всего: нет |
ginnie,
спасибо, всё ясно о чём вы ![]() DurRandir, почитаем о реализации такой идеи и если ничего не выйдет с более вышестоящим советом, то обязательно попробуем, спасибо |
|||
|
||||
zerg13new |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 ВСЁ народ, всем ОГРОМНОЕ спасибо за то что живо отреагировали на мои проблемы и дали дельные советы. Вы мне помогли очень-очень. Именно за такие сообщества я и обожаю инет ![]() Это сообщение отредактировал(а) zerg13new - 3.4.2010, 17:22 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |