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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Socket, Бесконечный цикл отправки сообщений 
:(
    Опции темы
OutlawZ
Дата 24.11.2011, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Привет всем, подскажите как организовать цикл отправки сообщений серверу, есть сервер на 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;


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


--------------------
user posted image
user posted image
PM MAIL   Вверх
Ramirez
Дата 24.11.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

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



а пример "нерабочего" кода есть?
PM ICQ   Вверх
OutlawZ
Дата 24.11.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Код

$| = 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 но там все работает как надо.


--------------------
user posted image
user posted image
PM MAIL   Вверх
Pfailed
Дата 24.11.2011, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это сообщение отредактировал(а) Pfailed - 24.11.2011, 18:49


--------------------
PM MAIL   Вверх
OutlawZ
Дата 24.11.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Код

$| = 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. 


--------------------
user posted image
user posted image
PM MAIL   Вверх
Pfailed
Дата 24.11.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
PM MAIL   Вверх
OutlawZ
Дата 24.11.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Код

$| = 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);
 }


Вот сервер.


--------------------
user posted image
user posted image
PM MAIL   Вверх
Pfailed
Дата 25.11.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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


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

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


 




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


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

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