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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IO::Socket::SSL 
:(
    Опции темы
GShadrin
  Дата 17.11.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте.
Столкнулся с такой проблемой:
Есть программа клиент работающая по незащищенному соединению. Возникла необходимость прикрутить режим работы по ssl. Использую модуль IO::Socket::SSL.
При добавлении режима в программу возникли проблемы.
Перед добавлением кода в программу мной был написал маленький скрипт для проверки работы модуля:

Код

use IO::Socket::SSL;
#my $sock;

sub n2
{
    my $sock = new IO::Socket::SSL("pop.gmail.com:995") || warn "I encountered a problem: ", &IO::Socket::SSL::errstr();
    $data=<$sock>;
    print "$data";
    return $sock;
}

sub n1
{
print $sock "USER **********\n";
$data=<$sock>;
print "$data";
print $sock "PASS **********\n";
$data=<$sock>;
print "$data";
print $sock "stat";
$data=<$sock>;
print "$data\n";
print $sock "top 1 1";
$data=<$sock>;
print "$data";
$data=<$sock>;
print "$data";
$data=<$sock>;
print "$data";
$data=<$sock>;
print "$data";
$data=<$sock>;
print "$data";
$data=<$sock>;
print "$data";
$data=<$sock>;
print "$data";
close $sock;
}

$sock=n2;
n1;


Этот код рабочий и имеет некоторое сходство со структурой программы клиента.

Клиент имеет следующую структуру:
В главном файле программы пользователю предлагается выбрать режим (с ssl или без) в некоторую переменную сохраняется идентификатор режима. Имеются два модуля для работы с сетью (по ssl и без). В каждом методы подключиться, отправить команду на сервер, считать ответ сервера (одну строку). При любом обращении к сети дергается промежуточный модуль в него передаются параметры для ф-ий этих модулей и режим работы - модуль в зависимости от режима вызывает соответствующую ф-ию из нужного модуля и вернувшийся ответ передает главному скрипту. 
После построения такой структуры в старом режиме, без ссл, все работает отлично. По ссл - происходит подключение но при попытке считать строку после команды приходит пустая  строка.  Важно, что подключение и отправка/получение происходят в разных функциях главного скрипта. Функция подключения вызывает подключение в промежуточном модуле и получает ОПИСАТЕЛЬ СОКЕТА - который является ГЛОБАЛЬНОЙ переменной. 

Подключение происходит следующим образом:
Код

#главный скрипт
($flag, $pop3_sock)=net::connectSocket($servmode, $servname, $port, $timeout);

#промежуточный модуль
sub connectSocket($$$) { my ($command) = "net".shift(@_)."::connectSocket"; return &$command(@_);}

#модуль с ssl (nets.pl)
sub connectSocket
{    
    my $servname = shift;
    my $port = shift;
    my $timeout = shift;
    my $flag=1; my $sock;
    eval 
    {        
        local $SIG{ALRM} = sub { die "alarm\n" }; 
        alarm  $timeout;
        $sock = new IO::Socket::SSL("$servname:$port") || ($flag=0);#warn "I encountered a problem: ", &IO::Socket::SSL::errstr();
        alarm 0;
    };
    if ($@) 
    { return 0;} 
    else  { return $flag, $sock;    }    
}


#модуль без ssl (netu.pl)
sub connectSocket($$)

{    

    my $sock;

    socket($sock, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

    my $servname = shift;

    my $port = shift; my $timeout = shift; my $flag=1;

    eval 

    {

        local $SIG{ALRM} = sub { die "alarm\n" }; 

        alarm  $timeout;    

        my $iaddr = inet_aton($servname) || ($flag=0);    

        if ($flag)

        {            

            my $paddr = sockaddr_in($port, $iaddr);        

            connect($sock, $paddr) || ($flag=0);                

        }

        alarm 0;

        #return $flag, $sock;

    };

    if ($@) 

    {        

        return 0;        

    } 

    else 

    {    

        return $flag, $sock;

    }    

}


При подключении без ссл - все отлично работает при подключении c ссл получает пустые строки в ответ.
Мной замечено: что если обращаться к серверу из той же функции где происходит подключение в главном скрипте ответы приходят. Почему? Ведь в описанном мною в начале скрипте происходит тоже самое , но все работает. Ведь без ссл происходит тоже самое - только используется другой модуль для работы в сети и сокет не является объектом. Как так? 
Может кто то знает с чем это связано.
Возможно я не очень хорошо описал проблему.

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


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

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


 




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


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

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