Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
помогите подправить демон на perl'e |

19.05.2009, 18:13
|
|
Участник форума
Регистрация: 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;
|
|
|

19.05.2009, 18:33
|
|
Reservists Of Antichat - Level 6
Регистрация: 23.08.2007
Сообщений: 1,237
Провел на форуме: 18127311
Репутация:
1676
|
|
Если смысл чисто в отправке строки $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;
}
}
|
|
|

19.05.2009, 18:48
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
что-то не получается - вот мой работал только после первого конекта падал
все время пишит Peer connected:
Последний раз редактировалось malik555; 19.05.2009 в 19:00..
|
|
|

19.05.2009, 19:57
|
|
Reservists Of Antichat - Level 6
Регистрация: 23.08.2007
Сообщений: 1,237
Провел на форуме: 18127311
Репутация:
1676
|
|
Под win xp (perl v5.8.8) и под fedora (perl v5.8.8) у меня все работает. Так что хрен знает
|
|
|

20.05.2009, 15:16
|
|
Участник форума
Регистрация: 05.11.2008
Сообщений: 105
Провел на форуме: 292722
Репутация:
71
|
|
так может дело в клиенте? пример кода можно?
|
|
|

09.06.2009, 11:11
|
|
Участник форума
Регистрация: 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));
то все работает , а если брать данные которые приходят от клиентов то не работает !
|
|
|

10.06.2009, 14:48
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
Может кто знает как решить такую проблему !
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|