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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> взаимодействие двух скриптов на удаленных компах, как организовать? 
V
    Опции темы
saint
  Дата 3.2.2006, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток.

Подскажите плз. как организовать сабж. Целевая платформа на обоих машинах - Выньдоуз. Один из скриптов выступает в роли сервера - принимает, обрабатывает и отсылает данные. Какие модули для этого использовать? Если возможно, приведите пожалуйста примеры или ссылки на примеры.

Заранее благодарен.

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата(saint @ 2.2.2006, 21:35 Найти цитируемый пост)

Подскажите плз. как организовать сабж. Целевая платформа на обоих машинах - Выньдоуз. Один из скриптов выступает в роли сервера - принимает, обрабатывает и отсылает данные. Какие модули для этого использовать? Если возможно, приведите пожалуйста примеры или ссылки на примеры.

Юзай модули Socket, IO::Socket, потоки, процессы. Всё же для того, что бы разобраться с их функциями, нужно читать документацию: perldoc Socket, perldoc IO::Socket.
Вот тебе пример сервера и клиента с использованием модуля Socket, всё читай в коментариях, я постарался пояснить каждую строку кода:
Сервер
Код

#!/usr/bin/perl -w
use strict;
use sigtrap;
use Socket qw(:DEFAULT :crlf);
use Fcntl qw(:flock);

# Порт, который будем прослушивать
my $port = shift || 6666;
my $file = shift || "journal.log";

# По этой переменной будем ориентрироваться, когда нужно завершить работу сервера
my $ex = 0;
$| = 1;

# Узнаём номер протокола по имени
my $prot = getprotobyname('tcp');

my $ask = '';

# Перехватываем сигнал INT, при котором инкрементируем переменную флаг для завершения работы
$SIG{INT} = sub { $ex++ };

# Открываем сокет AF_INET, на указанном порту или умираем с сообщением об ошибке
socket(SERVER, AF_INET, SOCK_STREAM, $prot) or die "Can't start server at port '$port': $!\n";

# Привязываем сокет к локальному адресу
my $addr = sockaddr_in( $port, INADDR_ANY );
bind(SERVER, $addr)   or die "Can't linked with local address: $!\n";

# Создаём очередь, насколько позволяет система
listen(SERVER, SOMAXCONN) or die "Can't listen because: $!\n";

# Выводим сообщение о том, что сервер ожидает подключения и разделительную линию
warn "Server check connection at port '$port'...\n";
warn "-" x 60, "\n";

# Начинаем прослушивать порт, до тех пор, пока не поступит сигнал INT
until ( $ex ) {
        # Ожидаем подключения
        my $rm_addr = accept(CLIENT, SERVER);

        # Если не было подключений, преходим к следующей итерации
        next unless $rm_addr;

        # Если мы попали сюда, значит клиент подключился, узнаём порт и имя клиента
        my($user_port, $user_addr) = sockaddr_in($rm_addr);

        # Добавляем запись в журнал, о том, что юзер подключился
        journal($file, $port, $user_port, inet_ntoa($user_addr), "Client connected");

        # Выдаём клиенту сообщение, о возможных командах
        print CLIENT "=" x 70, CRLF;
        print CLIENT "\t\tHello. This is a server for socket tested!$CRLF$CRLF";
        print CLIENT "Your IP adress is: " . inet_ntoa($user_addr) . CRLF;
        print CLIENT "You connected from client port: $user_port$CRLF";
        print CLIENT "You connected from server port: $port$CRLF";
        print CLIENT "The date on server is: " . dateTime(0) . CRLF;
        print CLIENT "The time on server is: " . dateTime(1) . CRLF . CRLF;
        print CLIENT "Bye, bye....$CRLF";
        print CLIENT "=" x 70, CRLF;

        # Добавляем запись в журнал, о том, что юзер открлючился
        journal($file, $port, $user_port, inet_ntoa($user_addr), "Client disconnected");

        # Закрываем сокет
        close(CLIENT);
}

# Останавливаем сервер, если мы оказались здесь, значит получили сигнал INT
close(SERVER);

# Подпрограмма получает 1 или 0, если 1 - то вернёт время, если 0 - то дату
sub dateTime {
    my $flag = shift || 0;
    if ( $flag ) {
         my @time = (localtime)[0..2];
         $time[0] = "0" . $time[0] if $time[0] < 10;
         $time[1] = "0" . $time[1] if $time[1] < 10;
         $flag = join(":", reverse @time);

    } else {
         my @date = (localtime)[3..5];
         $date[0] = "0" . $date[0] if $date[0] < 10;
         $date[1] = "0" . $date[1] if ++$date[1] < 10;
         $date[2] += 1900;
         $flag = join("-", @date);
    }
    return $flag;
}

# Подпрограмма добавляет запись в журнал
sub journal {
    my( $file, $port, $user_port, $user_addr, $msg ) = @_;
    local *JOURNAL;
    start_lock();
    open(JOURNAL, ">> $file") or die "Can't open JOURNAL '$file': $!\n";
    print JOURNAL "[" . join("][", scalar localtime, $msg, $port, $user_addr, $user_port ) . "]\n";
    close(JOURNAL) or die "Can't close JOURNAL '$file': $!\n";
    stop_lock();
}

# Подпрограмма начинает монопольную блокировку
sub start_lock {
    open(BLOCK, "> lockedfile.smf") or die "Can't open block file: $!\n";
    flock(BLOCK, LOCK_EX) or die "Can't locked file: $!\n";
}

# Подпрограмма завершает монопольную блокировку
sub stop_lock {
    close(BLOCK) or die "Can't close block file: $!\n";
}

Клиент:
Код

#!/usr/bin/perl -w
use strict;
use Socket qw(:DEFAULT :crlf);
use IO::Handle;

my $host = shift || "84.193.112.33";
my $port = shift || 6666;

my $pack_addr = gethostbyname($host);
my $proto     = getprotobyname('tcp');
my $dest      = sockaddr_in($port, $pack_addr);

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Can't create socket: $!\n";
connect(SOCK, $dest) or die "Can't connect to '$host' at port '$port': $!\n";
print <SOCK>;
close(SOCK);
print "For exit press 'ENTER'\n";
<>;

Кстати, если ты запустишь клиент не изменяя адрес и порт, то должен по идее получить информацию от сервера, который запущен у меня. Я запустил его на один день, для теста.

Почитай документацию по модулю IO::Socket, там аналогичный сервер с клиентом будут намного проще, правда работать будет немного медленнее, но скорость для работы с сетью не всегда критична, в любом случае программа работает на порядок быстрее, чем данные передаются по сети.

ЗЫ: На самом деле это не самый лучший вариант, по нормальному сервер должен работать в фоновом режиме, а так же работать с потоками или процессами. Но это ты уже сам почитай в документации.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
saint
Дата 3.2.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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


 




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


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

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