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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> два потока + один сокет = проблема 
:(
    Опции темы
CiklodoL
  Дата 27.8.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



здравтсвуйте, я пишу IRC бота, в боте два процесса, один отсылает сообщения, второй отвечает за пинг сервера, эти два процесса используют один сокет, процесс пинга читает сокет в цикле:

while ($answ = <$socket>)
{
   chomp $answ; 
   if ($answ =~ /^PING(.*)$/i)
      { print $socket "PONG $1\r\n"; }
}

это процесс отсылки сообщения:
while (1)
{ print $socket "PRIVMSG $chanel $text\r\n"; sleep (8); }

проблема в том что процесс отсылки сообщения срабатывает только если что то написать на канале, то есть послать в сокет, т.е. проблемы с использованием сокета двумя процессами, собственно вопрос - как это решить?
PM MAIL   Вверх
bel_nikita
Дата 27.8.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



я не спец в perl'е, но сокеты бывают блокирующие и неблокирующие. Может какая блокировка мешает, хотя прием-передача не должны влиять друг на друга


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
shamber
Дата 30.8.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



bel_nikita, разговор не об этом, приведите весь кусок кода, как у Вас обрабатываются данные и как вы определяете момент, что пора послать сообщение.
А поповоду irc, есть куча модулей, мож с ними проще?
PM MAIL Jabber   Вверх
nitr
Дата 30.8.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



CiklodoL, ничем не исправить, если только будете с периодичностью передавать команду PING (зависит от настроек сервера). IRC такого вам не позволит (в большинстве случаев), т.е. в вашей ситуации это нормально.

Но можете глянуть на огромное количество модулей для работы с этим протоколом.
http://search.cpan.org/search?query=irc&mode=all

В общем с IRC не выйдет, или сделайте самопальный пинг smile


--------------------
PM   Вверх
CiklodoL
Дата 30.8.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
А поповоду irc, есть куча модулей, мож с ними проще?

с ними то может и проще, но самому написать куда интереснее и познавательней)

вот привоже мой код, и результат его работы:
Цитата
Dsdaf    Hello
Dsdaf    Hello
CiklodoL    ыыы
Dsdaf    Hello
CiklodoL    и тут мы видим что если послать в канал сообщение, то бот нам ответит
Dsdaf    Hello


Код
#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket::INET;
use threads;

my $serv = 'irc.tsk.ru';
my $port = 7771;
my $chanel = '#dsda';
my $nick = 'Dsdaf';
my $ident = 'mIRC';
my $name = 'dsdad';
my $text = 'Hello';

my $sock = new IO::Socket::INET(PeerAddr => $serv,
                                PeerPort => $port,
                                Proto => 'tcp');

print $sock ("NICK $nick\r\n".
             "USER $ident 8 * :$name\r\n".
             "JOIN $chanel\r\n");

threads->create(\&ping);

sub ping
{
    print "Ping sub start\n";
    while (my $answ = <$sock>)
    { print $answ; 
     chomp $answ;
     if ($answ =~ /^PING(.*)$/i)
     { print $sock "PONG $1\r\n" }
    }
}

while (1)
{ print $sock "PRIVMSG $chanel :$text\r\n";
 sleep(20); }

PM MAIL   Вверх
vadiml
Дата 2.9.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



CiklodoL
если я правильно помню протокол IRC, то PING можно слать не через опр. промежуток времени от предыдущего PING'а, а от последней отправки любого сообщения на сервер, т.е. отправка любого сообщения равносильна PING'у, а получение -- PONG'у. Исходя из этого нет смысла выносить ping/pong в отдельный процесс, и таймер для отсчета времени для отправки PING'а можно разместить в основном.

Так же если вы долго сами не будете ни чего посылать серверу, то он сам Вам пошлет PING.
PM MAIL Jabber   Вверх
nitr
Дата 2.9.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Цитата(vadiml @  2.9.2007,  10:47 Найти цитируемый пост)
Так же если вы долго сами не будете ни чего посылать серверу, то он сам Вам пошлет PING.

Да и в этом случае надо эту команду обработать и послать PONG, иначе отключение неизбежно.

Я же советовал сделать "самопальный пинг", т.е. внтури самого бота. Т.к. чтобы что-то" получить", надо что-то "послать" smile . IRC-сервер сам шлет команду PING, только по окончании некоторого времени, а так он про вас "будто забывает", и вообще никакие данные не поступают в "сокет", вот и советую самому их послыать smile


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


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

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


 




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


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

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