Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Socket


Автор: OutlawZ 24.11.2011, 00:45
Привет всем, подскажите как организовать цикл отправки сообщений серверу, есть сервер на perl который висит и слушает что ему отсылают,  вот клиент:
Код

use Socket;
 socket(SOCK, AF_NET,SOCK_STREAM,getprotobyname('tcp')) or die "$!";
 my $sin = sockaddr_in(5432,127.0.0.1);
 connect(SOCK, $sin) or die "$!";
   chomp(my $line = <STDIN>);
   send(SOCK, "$line",0);
   sysread(SOCK, $buf, 1024);
   print $buf;


т.е когда я выключаю бесконечный цикл то отправляется только первая команда, остальные которые вводишь не уходят. Подскажите что не так?

Автор: Ramirez 24.11.2011, 17:07
а пример "нерабочего" кода есть?

Автор: OutlawZ 24.11.2011, 18:40
Код

$| = 0;

use Socket;
 socket(SOCK, AF_NET,SOCK_STREAM,getprotobyname('tcp')) or die "$!";
 my $sin = sockaddr_in(5432,127.0.0.1);

  while ( connect(SOCK, $sin) ) {
   chomp(my $line = <STDIN>);
    send(SOCK, "$line",0);
     sysread(SOCK, $buf, 1024);
   print $buf;
   redo;
  }


Вот не рабочий код, каюсь я с Socket только начал работать , до этого использовал IO::Socket но там все работает как надо.

Автор: Pfailed 24.11.2011, 18:46
А redo зачем?
Ах, это такая хитрость чтоб второй раз не законнектиться?

Автор: OutlawZ 24.11.2011, 19:06
Код

$| = 0;

use Socket;
 socket(SOCK, AF_NET,SOCK_STREAM,getprotobyname('tcp')) or die "$!";
 my $sin = sockaddr_in(5432,127.0.0.1);
 connect(SOCK, $sin) or die "$!";
  while ( 1 ) {
   chomp(my $line = <STDIN>);
    send(SOCK, "$line",0);
     sysread(SOCK, $buf, 1024);
   print $buf;
  }


Вот без redo но тоже не хочет отсылать вторую команду, просто я думал что если коннект прошел то функция connect возвращает 1. 

Автор: Pfailed 24.11.2011, 19:33
Там AF_INET, не AF_NET. Код сервера покажите. Может он соединение закрывает после первого ответа.

Автор: OutlawZ 24.11.2011, 19:52
Код

$| = 0;

use Socket;
 socket(SOCK, AF_INET,SOCK_STREAM,getprotobyname('tcp')) or die "$!";
 $sin = sockaddr_in(5432, INADDR_ANY);
 bind(SOCK, $sin) or die "$!"; 
 print "[~]Сервер запущен!\n";
        
 listen(SOCK, SOMAXCONN);
 while (my $c = accept(CLIENT,SOCK)) {
  my ($client_port, $client_ip) = sockaddr_in($c);
  my $client_ipnum = inet_ntoa($client_ip);
  
    my $data;
    sysread(CLIENT, $data, 1024);
    my ($mcmd, $cmd) = split(':', $data);
     #Обработка одной команды, показ IP и порта
     if ( $mcmd eq 'f') {
        print CLIENT "$client_ipnum:$client_port\n";
     }else {
        print CLIENT "Нет такой команды!";
     }
     #Обработка служебных команд, выход
     if ( $cmd eq 'r' ) {
        exit 0;
     }
    close(CLIENT);
 }


Вот сервер.

Автор: Pfailed 25.11.2011, 08:39
Ну действительно закрывает. Значит в клиенте нужно заново коннектиться каждый раз. Как в первом варианте, только без redo.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)