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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IO::Socket::INET не получаю ответ, виснет при получении ответа от сервера 
V
    Опции темы
alezzz
Дата 27.12.2010, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Делаю по книжке и примерам в интернете, такой вот код:
Код

#!/usr/bin/perl

use IO::Socket;
use strict;

my $socket = IO::Socket::INET->new(PeerAddr => "192.168.0.1",
                                   PeerPort => "telnet",
                                   Proto => "tcp",
                                   Type => SOCK_STREAM
                                  ) or die "Could't connect  : $@\n";
                               
$| = 1;

print "Connected...\n";
print $socket "\n\n";

print while(<$socket>);

close $socket;

На 192.168.0.1 вижу ESTABLISHED к 23 порту, но программа виснет на print while(<$socket>); (в любой комбинации, пробовал и переменной присваивать <$socket>), а я рассчитывал на что-то типа "login: " на выходе. Нигде на просторах интернета пока не нашел подобной проблемы.

ActivePerl на Windows, удаленый хост -- FreeBSD.
PM MAIL   Вверх
Pfailed
Дата 27.12.2010, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что если перед началом чтения из сокета вставить нижеследующий код?
Код

$/ = "\012";




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


сплю...
**


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

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



попробовал тоже-самое сделать через use Socket, результат такой-же.

Цитата(Pfailed @  27.12.2010,  20:02 Найти цитируемый пост)
Что если перед началом чтения из сокета вставить нижеследующий код?

тоже-самое, виснет.

Это сообщение отредактировал(а) alezzz - 27.12.2010, 20:04
PM MAIL   Вверх
Pfailed
Дата 27.12.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда попробуйте читать из сокета с помощью sysread()


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


сплю...
**


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

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



Пробовал таким способом:
Код

my $byte;
while (sysread(REMOTE, $byte, 1) == 1) 
{
  print STDOUT $byte;
}

на выходе 8-10 символов "мусора". 

Попробовал запустить на FreeBSD -- результат такой-же.

Сам telnet-сервер нормально работает.
PM MAIL   Вверх
Pfailed
Дата 27.12.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Видимо в этих восьми байтах приходит одна из telnet команд. Ознакомьтесь со спецификацией протокола telnet.
Помимо этого можно попробовать использовать готовое решение, есть Net::Telnet


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


сплю...
**


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

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



Про Net::Telnet я знаю, с ним все нормально работает, дело не в самом телнете а именно в сокете, телнет как простой пример.

Попробовал на http, отправил на 80 порт GET ... и получил результат обычным текстом, видимо все-таки придется ознакомиться со спецификацией telnet.
PM MAIL   Вверх
srl
Дата 20.1.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может просто в сокете нет ничего, и оно блокируется?
Попробуй неблокирующее чтение (сегодня я всем советую неблокирующее чтение, да  smile ).
PM MAIL   Вверх
alezzz
Дата 21.1.2011, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Спасибо, уже разобрался fork-ом.

А вообще, не в стране советов живем, можно и примером поделится. smile

Это сообщение отредактировал(а) alezzz - 21.1.2011, 08:55
PM MAIL   Вверх
srl
Дата 21.1.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(alezzz @ 21.1.2011,  08:48)
Спасибо, уже разобрался fork-ом.

А вообще, не в стране советов живем, можно и примером поделится. smile

Угу, у нас страна примеров... 8)) У-у, демон.  smile  Ну держи:

Код

#!/usr/bin/perl

use strict;
use IO::Socket;
use IO::Select;

my $socket = IO::Socket::INET->new(
    PeerAddr => "192.168.1.1",
    PeerPort => 80,
    Proto => "tcp",
    Type => SOCK_STREAM
) or die "Could't connect: $@\n";
                               
print "Connected...\n";

my $s = IO::Select->new();
$s->add($socket);
$s->add(\*STDIN);

LOOP: while(my @handles = $s->can_read){
    foreach my $handle (@handles){
     if ($handle == \*STDIN){
         # если прочитали из STDIN - отправим это дело в наш сокет.
         my $command = <$handle>;
         print $socket $command;
     } else {
         my $str = <$handle>;
         if (!defined $str){
             # если прочитали undef из готового хендлера - значит он закрылся.
             print "Server has closed connection.\n"; 
             $s->remove($handle);
             last LOOP; # т.к. у нас всего два хендлера, то закругляемся. 
         }
         print $str;
     } # if handle
    } # foreach handle
} # while

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


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

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


 




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


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

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