The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"нужна помощь по Socket Perl"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы WEB технологии (Public)
Изначальное сообщение [Проследить за развитием треда]

"нужна помощь по Socket Perl"  
Сообщение от harakiry email(ok) on 30-Апр-07, 23:42 
Написал скрипт который должен конектится к одному серверу по определённому порту, если не удаётся это сделать, то создаётся новый сокет и он пытается это сделать по другому порту к тому же серверу.


#!perl.exe
use strict;
use Socket qw(:DEFAULT :crlf);
use NET::Ping;
use IO::Socket;

my ($serv_for_get_serv, $port_for_get_serv, $serv_for_get_serv_2, $port_for_get_serv_2) = ('mrim.mail.ru', 2042, 'mrim.mail.ru', 443);
my ($serv_for_connect, $port_for_connect);


sub connect1{

    my $sock;
        if($sock = new IO::Socket::INET->new(    
                                            PeerAddr  => $serv_for_get_serv,
                                            PeerPort  => $port_for_get_serv,
                                            PeerProto => 'tcp',
                                            TimeOut   => 5,
                                            ))
        
                {
                my $result='';
                read($sock, $result, 18);
                if($result=~m/(.+):(.+)/){} else{print "Content-type:r text/plain\n\nERROR:1" and exit(1);}
                ($serv_for_connect, $port_for_connect) = ($1, $2);
                send_result();
                }
        else
                {
                            my $sock2;
                            if($sock2 = new IO::Socket::INET->new(    
                                            PeerAddr  => $serv_for_get_serv_2,
                                            PeerPort  => $port_for_get_serv_2,
                                            PeerProto => 'tcp',
                                            TimeOut   => 2,
                                            ))
                            {
                                my $result='';
                                read($sock2, $result, 18);

                                if($result=~m/(.+):(.+)/){} else{print "Content-type:r text/plain\n\nERROR:2" and exit(1);}
                                ($serv_for_connect, $port_for_connect) = ($1, $2);
                                send_result();
                            }
                }
    }


sub send_result
    {
        print "Content-type:r text/xml\n\n";
        print '<?xml version="l.0"?>';
        print '<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">';
        print '<cross-domain-policy>';
        print '<allow-access-from domain="' . $serv_for_connect . '" to-ports="' . $port_for_connect . '"/>';
        print '</cross-domain-policy>';
        exit(0);
    }
    
    
connect1();

Но получается то что попробовав приконектится по порту 2042, он не пытается приконектится к 443(смотрел сканером) и принтует ERROR2, как-будто приконектился и скачал данные, которые проверяются по шаблону и не подходят из-за чего и выводится ERROR 2, хотя по идее в случае неудачных коннектов не должно ничего выводится.
МОжет я хочу невозможного ?
Помогите чайнику

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "нужна помощь по Socket Perl"  
Сообщение от andy email(??) on 02-Май-07, 05:47 
Плохо понял, что должно должно выполняться в итоге (send_result точно в STDOUT должен выводить?), но по части коннекта нижеприведенный кусок работает 100%

#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;

sub main;
sub connection($$);

main;

sub connection($$) {
  my($ip, $port, $sock);
  ( $ip, $port ) = @_;
  $port = getservbyname($port, 'tcp') if $port =~ /\D/;
  $sock = IO::Socket::INET->new( PeerAddr  => $ip,   PeerPort => $port,
                                 PeerProto => 'tcp', Timeout  => 5
                                 );
  warn "sock == undef" unless defined $sock;
  return $sock;
}

sub main {
  my( $sock );
  $sock = connection('192.168.250.6', '1111') || connection('192.168.250.6', '80');
  die "I`m so lonely...\n" unless defined $sock;
  # пошло общение
  # ...
  # ...
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "нужна помощь по Socket Perl"  
Сообщение от harakiry email(ok) on 02-Май-07, 07:08 
Скрипт запрашивается из Flash, STDOUT апача.

Изначально в скрипте первым для коннекта поселился порт 2042 и вот после всех мытарств решил первым попробовать коннект к 443-у (коннекты само собой шли при выключенном M$ фаервол агенте, чтобы проверить будет ли реконнект в случае неудачи) и скрипт даже не пытался этого сделать, а сразу завершал работу, что очень странно потому что при включённом M$ фаервол агенте скрипт спокойно конектился к этому порту и скачивал то что нужно.

Вобщем при выключенном M$ фаервол агенте и заменой 443 порта на другой, скрипт пытается приконектится к двум разным портам, тоесть скрипт рабочий, но лажа какае-то с 443-м портом.

Спасибо за скрипт, есть что подчерпнуть)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "нужна помощь по Socket Perl"  
Сообщение от Homewrecker (ok) on 02-Май-07, 19:08 
Может я плохо понял, но
$sock = IO::Socket::INET->new("$host_1:$port_1") or $sock = IO::Socket::INET->new("$host_1:$port_2");

подходит?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "нужна помощь по Socket Perl"  
Сообщение от harakiry email(ok) on 03-Май-07, 07:47 
>Может я плохо понял, но
>$sock = IO::Socket::INET->new("$host_1:$port_1") or $sock = IO::Socket::INET->new("$host_1:$port_2");
>
>подходит?

Вот это краткость!

Как уже написал, я разобрался и дело не в скрипте а в винде, в том что при выключенном фаервол агенте скрипт даже не пытается приконнектится к 443-у порту а сразу завершается свою работу(смотрю в сканере), тогда как при включённом фаервол агенте соединение проходит успешно. Если вместо 443-го вписать любой другой, то всё работает.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "нужна помощь по Socket Perl"  
Сообщение от andy email(??) on 03-Май-07, 08:16 
>Вот это краткость!

Ну если нравится краткость... :)
Для произвольного количества вариантов подключений

@addrs = qw( 192.168.250.6:1111    192.168.250.6:80    192.168.250.6:801 );
$sock = IO::Socket::INET->new($_) and last foreach @addrs;

if( defined $sock ) {
  ...
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру