ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

помогите подправить демон на perl'e
  #1  
Старый 19.05.2009, 18:13
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию помогите подправить демон на perl'e

Всем привет !


Запускаю даемон - но он после первого конекта - просто падает на сервере !

Задача даемона ответить клиенту переменной $mes и оборвать конект !


PHP код:
  #!/usr/bin/perl  use POSIX;  use Errno;  use IO::Socket;  use IO::Select;  use Tie::RefHash ();    my $DaemonPort = 843;          #-- Порт, по которому происходит подключение  my $min_login_length = 3;       #-- Минимальная длина имени  my $shutdown = 0;  tie %logins, 'Tie::RefHash';      tie %in_buf, 'Tie::RefHash';  my (%out_buf, $TIME);    close STDIN; close STDERR;  fork && exit;    $|=1;            my $server = IO::Socket::INET->new(LocalPort => $DaemonPort, Listen => 10 ) or die "Can't make server socket: $@n";  my $select = IO::Select->new($server);          while (! $shutdown) {                                              foreach my $client ($select->can_read(0.1)) { #-- Принимаем информацию от клиентов                                                  if($client == $server){               #-- Новый клиент                                                      $client = $server->accept();                           $client->autoflush(1);                           $select->add($client);                                                      print "da\n";                           }                            else                            {                            print "no\n";                            $mes = '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>';                                                          $out_buf{$client} .= $mes;                                                                                }                                                                        }                         foreach my $client ($select->can_write(0.1)) {                              next unless exists $out_buf{$client};                                my $rv = $client->send("".$out_buf{$client}.chr(0), 0);                           unless (defined $rv) {                                                   next;                               }                      if ($rv == length($out_buf{$client})+1 or Errno::EINPROGRESS == $! or Errno::EWOULDBLOCK ) {#-- Удалим тот кусок данных, что клиент удачно получил                          substr($out_buf{$client}, 0, $rv) = '';                          delete $out_buf{$client} unless length($out_buf{$client});                                                                                                    }                          else                          {                                                 next;                         }                       }                        }#- shutdown        $server->close();  exit;
 
Ответить с цитированием

  #2  
Старый 19.05.2009, 18:33
Аватар для Kaimi
Kaimi
Reservists Of Antichat - Level 6
Регистрация: 23.08.2007
Сообщений: 1,237
Провел на форуме:
18127311

Репутация: 1676


Отправить сообщение для Kaimi с помощью ICQ
По умолчанию

Если смысл чисто в отправке строки $mes и закрытии соединения, то попробуй так
Код:
use strict;
use warnings;
use IO::Socket;
$SIG{CHLD} = 'IGNORE';

my $mes = '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>';
my $port = 843;

my $sock = IO::Socket::INET->new(LocalPort => $port, Listen => 10, Proto => 'tcp', Reuse => 1) || die $!;

while (my $conn = $sock->accept)
{   
 my $child = undef;
 die $! unless defined ($child = fork);
 if ($child == 0)
    {
	 $sock->close;
	 print $conn $mes;
	 $conn->close;
	 exit 0;
    } 
 else
    {
	 warn "Peer connected: ".$conn->peerhost."\n";
	 $conn->close;
    }
}
 
Ответить с цитированием

  #3  
Старый 19.05.2009, 18:48
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

что-то не получается - вот мой работал только после первого конекта падал

все время пишит Peer connected:

Последний раз редактировалось malik555; 19.05.2009 в 19:00..
 
Ответить с цитированием

  #4  
Старый 19.05.2009, 19:57
Аватар для Kaimi
Kaimi
Reservists Of Antichat - Level 6
Регистрация: 23.08.2007
Сообщений: 1,237
Провел на форуме:
18127311

Репутация: 1676


Отправить сообщение для Kaimi с помощью ICQ
По умолчанию

Под win xp (perl v5.8.8) и под fedora (perl v5.8.8) у меня все работает. Так что хрен знает
 
Ответить с цитированием

  #5  
Старый 20.05.2009, 15:16
Аватар для demond
demond
Участник форума
Регистрация: 05.11.2008
Сообщений: 105
Провел на форуме:
292722

Репутация: 71
По умолчанию

так может дело в клиенте? пример кода можно?
 
Ответить с цитированием

  #6  
Старый 09.06.2009, 11:11
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

Теперь другая проблема !

Код:
#- часть кода из даемона

my $data = '';
my $rv   = $client->recv($data, POSIX::BUFSIZ, 0);  #Читаем данные 

#- данные я отправляю в xml  например строку
#-<a><con><comanda>start</comanda></con></a>

#- данные приходят все нормально только я пытаюсь #-эту строку разбить на хэш  но даемон сразу 
#-останавливается

my $lic = (XML::Simple->new()->XMLin($data));
Подскажите пожалуйста почему возникает такая проблема


Если просто прописать в даемоне

Код:
my $data = '<a><con><comanda>start</comanda></con></a>';
my $lic = (XML::Simple->new()->XMLin($data));
то все работает , а если брать данные которые приходят от клиентов то не работает !
 
Ответить с цитированием

  #7  
Старый 10.06.2009, 14:48
Аватар для malik555
malik555
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме:
350627

Репутация: 1
По умолчанию

Может кто знает как решить такую проблему !
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите подправить перл скрипт спамера от Каими Foxer007 PHP, PERL, MySQL, JavaScript 0 08.02.2009 15:11
помогите подправить dll MasterHuLi Реверсинг 10 13.10.2006 12:10
Народ!!! Помогите НАМ!!! Помогите покончить с беспределом!!! Monah Чаты 7 24.08.2005 07:06



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ