Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сокеты. Передача сообщений от клиента серверу.  (Прочитано 11779 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Darklen
Гость
« : 09-11-2008 04:54 » 

Выполняется реализация "клиент-сервер" стандартными средствами Перл. Необходимо, чтобы сервер посылал в ответ на запрос клиента либо системную дату, либо системное время. Не получается реализовать пересылку сообщений от клиента к серверу. Буду признательна, если кто-нибудь поможет!

Сервер

Код:
#!/usr/bin/perl -w
use strict;
BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
use Socket;
use Carp;

sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }

my $port = shift || 2345;
my $remote  = shift || 'localhost';

($port) = $port =~ /^(\d+)$/                        or die "nevernij port";

socket(Server, PF_INET, SOCK_STREAM, getprotobyname('tcp'))        || die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))   || die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY))        || die "bind: $!";
listen(Server,SOMAXCONN)                            || die "listen: $!";

logmsg "Server zapushen na portu $port";

my $paddr;

while(1) {
$paddr = accept(Client,Server);

my($port,$iaddr) = sockaddr_in($paddr);
        my $name = gethostbyaddr($iaddr,AF_INET);

logmsg "Soedinenie s $name [", inet_ntoa($iaddr), "] s porta $port";
print Client "Privet, $name! Vivesti daty (d) ili vremya (v)?\n";

close Client;
}

Клиент
Код:
#!/usr/bin/perl -w
use strict;
use Socket;
my ($remote,$port, $iaddr, $paddr, $proto, $line, $choice);

$remote  = shift || 'localhost';
$port    = shift || 2345;  # случайный порт
if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
die "net porta" unless $port;

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'))  || die "socket: $!";
connect(SOCK, sockaddr_in($port, inet_aton($remote)))    || die "connect: $!";
while (defined($line = <SOCK>)) {
print $line;

chomp($choice=<STDIN>);   #выбор пользователя, который нужно передать серверу
#send SOCK, "$choice", 0; #пытаюсь отправить на сервер


}
close (SOCK)            || die "close: $!";

exit;
Записан
Darklen
Гость
« Ответ #1 : 09-11-2008 08:06 » 

Уже разобралась сама.
В клиенте оставляем строчку
Код:
send SOCK, "$choice", 0;
А в сервере пишем:
Код:
while (1) {
$paddr = accept(Client,Server);
my $message = <Client>;      # читаем сообщение из клиента
print Client "OK\n";         # посылаем ответ клиенту
close Client;                # и закрываем поток
print STDERR $message;        # выводим сообщение
}
close Server;                   # и закрываем сокет
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 09-11-2008 08:30 » 

Darklen, у тебя есть еще некоторые мелочи, которые при "use strict" должны приводить к ошибкам. У тебя нет объявления переменных Client и Server в сервере и SOCK в клиенте. Дескрипторы IO::Handle такие же переменные, как и все.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Darklen
Гость
« Ответ #3 : 09-11-2008 15:40 » 

А как реализовать объявление Client и Server в сервере и SOCK в клиенте?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 09-11-2008 15:51 » 

Как и все переменные - через my.

Кстати, лучше использовать скаляр, чем имя без префикса. Ведь дескриптор - просто ссылка на объект типа IO::Handle.

Код: (Perl)
my $server;

socket($server, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
# .........
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines