
Эксперт
   
Профиль
Группа: Комодератор
Сообщений: 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, там аналогичный сервер с клиентом будут намного проще, правда работать будет немного медленнее, но скорость для работы с сетью не всегда критична, в любом случае программа работает на порядок быстрее, чем данные передаются по сети. ЗЫ: На самом деле это не самый лучший вариант, по нормальному сервер должен работать в фоновом режиме, а так же работать с потоками или процессами. Но это ты уже сам почитай в документации.
--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы".
|