Свързване на сокет с помощта на perl UserAgent

Имам скрипт, който използва следния код за свързване към сървър.

$sock = new IO::Socket::INET (
                                  PeerAddr => $server,
                                  PeerPort => $port,
                                  Proto => 'tcp',
                                );

Аз обаче съм зад прокси сървър и не мога да използвам този скрипт. За да преодолея това, трябва да добавя поддръжка на прокси. Предложение за SO беше да се използва UserAgent. Тъй като съм неграмотен в Perl, не съм сигурен как да заменя този код с този, който използва UserAgent. Не искам да пипам останалата част от кода. Мога ли да предефинирам $sock с помощта на UserAgent, така че този работен файл на скрипта. Скриптът, за който говоря, е достъпен тук


person Dilawar    schedule 25.02.2012    source източник
comment
Хей, имаш ли някакво решение сега?   -  person p.j    schedule 19.07.2014


Отговори (2)


Не съм сигурен за какъв модул „UserAgent“ говорите. Няма модул с такова име. Има много модули с UserAgent като част от името, но не знам нито един, който да се отнася за вашата ситуация.

Както и да е, мисля, че търсите IO::Socket::Socks. Никога не съм го опитвал лично, но вие трябва да можете да направите:

use IO::Socket::Socks;

my $sock = IO::Socket::Socks->new(
  ProxyAddr   => $hostname_of_your_proxy,
  ProxyPort   => $port_number_your_proxy_listens_on,
  ConnectAddr => $server,
  ConnectPort => $port,
);

и оставете останалата част от кода такъв, какъвто е.

person cjm    schedule 25.02.2012
comment
Трябва ли да се тревожа за потребителско име и парола за удостоверяване на прокси? Освен това командата ping не получава отговор от moss.stanford.edu. Когато стартирам вашето решение, то казва Could not connect to server moss.stanford.edu: Illegal seek - person Dilawar; 02.03.2012
comment
Ако вашият прокси изисква удостоверяване, тогава да, ще трябва да предоставите и атрибутите Username и Password (и може би също AuthType, не съм сигурен). - person cjm; 02.03.2012

Предполагам, че имахте предвид тази дискусия? Но има разлика между получаването на някои файлове от HTTP сървър от разстояние (за този LWP::UserAgent наистина е по-уместно) и изпращането на файлове чрез IO::Socket(::INET), както в скрипта, който сте свързали.

Можете да използвате страхотното решение, предлагано от cjm, или просто да използвате socat, така:

socat TCP4-LISTEN:9999 TCP4:moss.stanford.edu:7690

... където 9999 се отнася за локалния прокси порт. Хубавото: няма да се налага да променяте скрипта на мъха; лошото: първо трябва да инсталирате socat.

person raina77ow    schedule 25.02.2012
comment
Прав си; вероятно това е дискусията, за която говореше. Но LWP::UserAgent е безполезен за тази цел, защото скриптът, за който говори, използва персонализиран протокол, а не HTTP или нещо друго, което LWP прилага. - person cjm; 25.02.2012
comment
да Това е дискусията, която прочетох. Трябваше да го спомена. Благодаря за това. Ще опитам това този уикенд. - person Dilawar; 27.02.2012