Полноценное использование служебного Инета

Xakep, номер #039, стр. 039-056-4


if (!connect(HTTPCMD, $sin)) {

<сообщаем, что коннект не удался>

exit;

}

В переменных $xport и $xhost должны находиться номер порта и имя хоста или его ip-адрес. Функция connect пытается сделать нечто соответствующее ее названию, и если это не удается, она возвращает 0. Если же все хорошо, то HTTPCMD будет дескриптором созданного соединения. Разрыв соединения будет выглядеть подобно закрытию файла: close(HTTPCMD);

Посылать данные по установленному соединению будем так:

send HTTPCMD, "$mydata", 0;

А принимать данные будем, читая из соединения как из файла:

$newline = ;

Теперь попробуй самостоятельно написать скрипт, который коннектится на какой-нибудь сервер, читает/пишет оттуда/туда что-нибудь, а затем закрывает соединение, чтобы этот процесс стал для тебя совсем прозрачным.

Если ты попробовал это сделать, то, вероятно, уже успел ощутить всю мощь, которую предоставляют скрипты, создающие соединения. Кайф заключается в том, что все эти соединения осуществляются от имени сервака хостинг-прова, на котором они запускаются, а этот сервак, в отличие от домашнего компа, имеет совершенно немереный канал, не говоря уже про то, что работает постоянно. Поэтому все проги, требующие большой канал или много on-line времени (например, брутфорсеры), во многих случаях выгоднее создавать на перле с сокетами. Однако поспешу тебя предупредить: злоупотребляя использованием исходящих сокетов, ты рискуешь навлечь на себя праведный гнев прова.

Вернемся к нашей проблеме. План действия таков: коннектимся на нужный http-сервер, закачиваем оттуда файл, сохраняем его под другим именем (тему маскировки и шифровки содержимого файла рассмотрим позже) и радуемся жизни. Написать кусок кода, который осуществит установку коннекта, я думаю, ты уже сможешь (если нет - вернись на два абзаца назад). Далее нужно немного пообщаться с веб-сервером, поэтому замолвлю пару слов о HTTP (Hypertext Transfer Protocol). Посмотри как выглядит стандартный запрос клиента веб-серверу:

GET /xxx.jpg HTTP/1.0

User-Agent: Mozilla

Accept: */*

Host: www.super-site.bjg.sg.jtr.ck

Range: bytes=110-3548790

В рассматриваемом случае особую важность имеют первая и последняя строки, потому что именно они определяют то, что будет возвращено сервером. Назначение первой строки в запросе, надеюсь, очевидно. Последняя строка определяет, какой именно кусок файла нужен. Если требуется закачать весь файл целиком, то ее указывать не надо. В приведенном примере клиент просит сервер вернуть ему кусок файла xxx.jpg со 110-го по 3548790-й байты включительно.

Кстати говоря, далеко не все сервера поддерживают частичную закачку файла. Тебе приходилось сталкиваться с серваками, не поддерживающими т.н. "докачку"? Так вот, это они и есть.

Чтобы не осложнять ситуацию, я буду рассматривать только хорошие сервера, которые ее поддерживают (благо в сети их большинство).

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

Назад на стр. 039-056-3  Содержание  Вперед на стр. 039-056-5