Автор Тема: Сокеты. Передача сообщений от клиента серверу.  (Прочитано 2965 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ViViolet

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Выполняется реализация "клиент-сервер" стандартными средствами Перл. Необходимо, чтобы сервер посылал в ответ на запрос клиента либо системную дату, либо системное время. Не получается реализовать пересылку сообщений от клиента к серверу. Буду признательна, если кто-нибудь поможет!

Сервер

#!/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 = )) {
print $line;

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


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

exit;

Оффлайн ViViolet

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Уже разобралась сама.
В клиенте оставляем строчку

send SOCK, "$choice", 0;

А в сервере пишем:

while (1) {
   $paddr = accept(Client,Server);
   my $message = ;      # читаем сообщение из клиента
   close Client;                # и закрываем поток
   print STDERR $message;        # выводим сообщение
}
close Server;                   # и закрываем сокет

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28