Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.95.38] |
|
Сообщ.
#1
,
|
|
|
Если кто-то знает, подскажите.
Прога на перле с use socket. Без LWP и прочих наворотов. Что-то типа . connect(MYSOCK, $sin) || die "Failed to connect() to server: $!\n"; send (MYSOCK, "GET / HTTP/1.0\n\n", 0) || die "Can't to send packet: $!\n"; open(OUT, ">download.txt"); while (<MYSOCK>) { print OUT <MYSOCK>; } . Так вот скачивает все (мне нужен заголовок ответа) кроме кода ответа сервера, ну там 404 - не найдено, 200 ОК и т.д. Коннекчусь туда же телнетом, даю GET - . HTTP/1.1 200 OK (*) Date: Wed, 28 Aug 2002 17:15:55 GMT Server: Apache/1.3.26 (Unix) Last-Modified: Tue, 28 Aug 2002 13:15:55 GMT . Перл отдает все кроме первой строки (*), а мне она как раз и нужна. Как победить? |
Сообщ.
#2
,
|
|
|
#!/usr/local/bin/perl
use IO::Socket; use strict 'vars'; my ($addr, $sin, $data, $proto, @data); $proto = getprotobyname('tcp'); die unless defined $ARGV[0]; $addr = $ARGV[0]; socket(SITE, PF_INET, SOCK_STREAM, $proto) or die $!; $sin = sockaddr_in(80, inet_aton($addr)); connect(SITE, $sin) or die "Connection to $addr failed!\n"; send(SITE, "GET / HTTP/1.1\n\n", 0, $sin) or die $!; recv SITE, $data, 50, 0; @data = split(/\n/, $data); print $data[0]; shutdown(SITE, 2); # Отака от *****, малятки! :-) |
Сообщ.
#3
,
|
|
|
Эээ?
Я же написал, программа на использует только use Socket а если IO::Socket, то тогда воде надо через $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org', PeerPort => 'http(80)', Proto => 'tcp'); Если я правильно в справке посмотрел. Но суть не в этом, а почему ты при recv закладываешь длину = 50? Кстати со своим примером я почти разобрался. |
Сообщ.
#4
,
|
|
|
Тогда решение в студию
|
Сообщ.
#5
,
|
|
|
Дело в том, что тебе ведь нужно было лишь получить строчку вида HTTP/1.1 200 OK, поэтому достаточно прочитать лишь 50.
З.Ы. Да и вообще-то зденсь не юзаются функции специфичные для IO::Socket, поэтому можешь спокойно написать use Socket; мне просто так захотелось! |
Сообщ.
#6
,
|
|
|
To vot -
В программе во-первых ошибка /_не я нашел_/, в цикле while надо ставить: while (<MYSOCK>) { print OUT $_; } Иначе строки выдаются через одну. Но это еще не все ошибки, после того как исправил стали выдаваться лишние пустые строки. |