Jump to content
Калькуляторы

Xinetd + UDP + Perl. Пишем сервер UDP под управлением Xinetd

Всем привет. Столкнулся с проблемой. Не могу получить и отправить данные в UDP сокет из Perl скрипта, сквозь Xinetd.

 

Конфиг Xinetd:

 

service check_state
{
    disable                 = no
    port                    = 30001
    socket_type             = dgram
    protocol                = udp
    wait                    = yes
    user                    = root
    server                  = /scripts/check_state.pl
    #env                     = HOME=/var/cvs
}

 

Perl код:

 

#!/usr/bin/perl

use IO::Handle;
use IO::Socket;
use Socket;

if (-S STDIN) { system("echo 'is sock' >> /tmp/xinetd.log"); } else { exit; }

my $sock = IO::Socket->new_from_fd(\*STDIN,"+<") or die "$!";

STDIN->fdopen($sock,"<") || die $!;
STDOUT->fdopen($sock,">") || die $!;
STDERR->fdopen($sock,">") || die $!;

print "test";

#$sock->send("test");

exit;

 

 

Итог: клиент данных не получает. У кого-нибудь есть опыт в данном случае?? Заранее спасибо

 

П.С. В режиме TCP сервера - писал. Там проблем не возникло.

Share this post


Link to post
Share on other sites

попробуйте вместо xinetd использовать netcat

 

Edited by marikoda

Share this post


Link to post
Share on other sites
попробуйте вместо xinetd использовать netcat

У меня уже есть такие же решения под Xinetd, только по TCP. Я считаю, лучше разобраться с данной задачей из соображения незахламления сервера кучами сервисов. Истина где-то рядом... 8)

Share this post


Link to post
Share on other sites
попробуйте вместо xinetd использовать netcat

У меня уже есть такие же решения под Xinetd, только по TCP. Я считаю, лучше разобраться с данной задачей из соображения незахламления сервера кучами сервисов. Истина где-то рядом... 8)

Если истина вдруг не появится, можно вообще написать демона на питоне (чисто из соображений тренировки в кодинге)

Share this post


Link to post
Share on other sites
попробуйте вместо xinetd использовать netcat

У меня уже есть такие же решения под Xinetd, только по TCP. Я считаю, лучше разобраться с данной задачей из соображения незахламления сервера кучами сервисов. Истина где-то рядом... 8)

Если истина вдруг не появится, можно вообще написать демона на питоне (чисто из соображений тренировки в кодинге)

Тогда уже можно накодить на Perl. :)

У меня даже где-то рабочий пример был.

Share this post


Link to post
Share on other sites
Тогда уже можно накодить на Perl. :)

У меня даже где-то рабочий пример был.

Если вас не затруднит, не могли бы найти свой пример?

Share this post


Link to post
Share on other sites

#!/usr/bin/perl

use strict;
use threads;
use IO::Socket;

my $pid = fork();

if ($pid == 0)
{

my $sock    = new IO::Socket::INET ( LocalHost => '0.0.0.0', LocalPort => '7070', Proto => 'tcp', Listen => 1, Reuse => 1);

die "Could not create socket: $!\n" unless $sock;

while (my $client = $sock->accept())
{
        $client->autoflush(1);
        my $sockthread = threads->new(\&accept_connection,$client);
        $sockthread->detach;
}

sub accept_connection
{
        my $client = $_[0];
        print $client ">> ";
        while (<$client>)
        {
                my $message = $_;
                print "Got command: $message";
                open FH, "$message |";
                while ()
                {
                        print $client $_;
                }
                print $client ">> ";
        }
        return;
}

}

Тупенький шелл, и на TCP. Зато многопоточный.

Share this post


Link to post
Share on other sites

ТСР понятно. А вот UDP как??

Share this post


Link to post
Share on other sites

ТСР понятно. А вот UDP как??

Я аналогично пробовал с UDP - все так же.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this