Форум: "Сети";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
ВнизЗакачка файла через несколько прокси Найти похожие ветки
← →
digiman (2007-07-20 14:00) [0]Есть сеть с сервером-доменом, он подключен к инету, на нем стоит прокси. Трафик (и скорость) разграничивается по пользователям, кому-то инета вообще не досталось (например, мне).
Понавешивал портмапперов на те компы, где есть инет. Теперь могу со своего компа выходить в нет через них. Но скорость у каждого из них сильно порезана.
Вопрос: Нужно написать прогу для закачки со сцылки через несколько компов-проксей одновременно, т.е. по кускам
← →
umbra © (2007-07-20 14:43) [1]поищите на тему http-заголовка ContentRange.
← →
Rouse_ © (2007-07-20 16:10) [2]Удалено модератором
Примечание: Дубль...
← →
Rouse_ © (2007-07-20 16:19) [3]Вот тебе примерчик. Что куда и почем - все есть в MSDN. Разберешся :)
////////////////////////////////////////////////////////////////////////////////
//
// ****************************************************************************
// * Project : DownloadViaProxy
// * Purpose : Демо скачивания файла с учетом бейсик авторизации и прокси
// * Author : Александр (Rouse_) Багель
// * Copyright : © Fangorn Wizards Lab 1998 - 2007.
// * Version : 1.02
// * Home Page : http://rouse.drkb.ru
// ****************************************************************************
//
program DownloadViaProxy;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Classes,
WinInet;
type
TDownloadParams = record
FileURL, // Запрос для файла
Proxy, // спивок прокси
ProxyPassword, // пароль для авторизации на прокси
AuthUserName, // логин для Authorization: Basic
AuthPassword: String; // пароль для Authorization: Basic
DownloadFrom, // смещение от начала данных
NeedDataSize: DWORD; // необходимый размер
end;
function DownloadFileEx(
Params: TDownloadParams; OutputData: TStream): Boolean;
function DelHttp(URL: String): String;
var
HttpPos: Integer;
begin
HttpPos := Pos("http://", URL);
if HttpPos > 0 then Delete(Url, HttpPos, 7);
Result := Copy(Url, 1, Pos("/", Url) - 1);
if Result = "" then Result := URL;
end;
const
Accept = "Accept: */*" + sLineBreak;
ProxyConnection = "Proxy-Connection: Keep-Alive" + sLineBreak;
LNG = "Accept-Language: ru" + sLineBreak;
AGENT =
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; " +
"Windows NT 5.1; SV1; .NET CLR 2.0.50727)" + sLineBreak;
var
FSession, FConnect, FRequest: HINTERNET;
FHost, FScript, SRequest, ARequest: String;
Buff: array of Byte;
BytesRead, Res, Len,
FilePosition, OpenTypeFlags, ContentLength: Cardinal;
begin
Result := False;
ARequest := Params.FileURL;
// Небольшой парсинг
// вытаскиваем имя хоста и параметры обращения к скрипту
FHost := DelHttp(ARequest);
FScript := ARequest;
Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
// Инициализируем WinInet
if Params.Proxy = "" then
OpenTypeFlags := INTERNET_OPEN_TYPE_PRECONFIG
else
OpenTypeFlags := INTERNET_OPEN_TYPE_PROXY;
FSession := InternetOpen("",
OpenTypeFlags, PChar(Params.Proxy), PChar(Params.ProxyPassword), 0);
if not Assigned(FSession) then Exit;
try
// Попытка соединения с сервером
FConnect := InternetConnect(FSession, PChar(FHost),
INTERNET_DEFAULT_HTTP_PORT, PChar(Params.AuthUserName),
PChar(Params.AuthPassword), INTERNET_SERVICE_HTTP, 0, 0);
if not Assigned(FConnect) then Exit;
try
// Подготавливаем запрос
FRequest := HttpOpenRequest(FConnect, "GET", PChar(FScript), nil,
"", nil, 0, 0);
// добавляем необходимые заголовки к запросу
HttpAddRequestHeaders(FRequest, Accept,
Length(Accept), HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(FRequest, ProxyConnection,
Length(ProxyConnection), HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(FRequest, LNG,
Length(LNG), HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(FRequest, AGENT,
Length(AGENT), HTTP_ADDREQ_FLAG_ADD);
// Проверяем запрос:
Len := 0;
Res := 0;
SRequest := " ";
HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or
HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);
if Len > 0 then
begin
SetLength(SRequest, Len);
HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or
HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);
end;
if not Assigned(FConnect) then Exit;
try
// Отправляем запрос
if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;
// Узнаем размер файла
Len := 4;
ContentLength := 0;
HttpQueryInfo(FRequest, HTTP_QUERY_CONTENT_LENGTH or
HTTP_QUERY_FLAG_NUMBER, @ContentLength, Len, Res);
// По необходимости выставляем позцию, откуда нужно начинать скачку
if Params.DownloadFrom > 0 then
begin
FilePosition := InternetSetFilePointer(
FRequest, Params.DownloadFrom, nil, FILE_BEGIN, 0);
if FilePosition = DWORD(-1) then
FilePosition := 0;
end
else
FilePosition := 0;
// Выставляем размер приемного буффера
if Params.NeedDataSize = 0 then
Params.NeedDataSize := ContentLength;
if FilePosition + Params.NeedDataSize > ContentLength then
Params.NeedDataSize := ContentLength - FilePosition;
SetLength(Buff, Params.NeedDataSize);
// Принимаем данные
if not InternetReadFile(FRequest, @Buff[0],
Params.NeedDataSize, BytesRead) then Exit;
OutputData.Write(Buff[0], Params.NeedDataSize);
Result := True;
finally
InternetCloseHandle(FRequest);
end;
finally
InternetCloseHandle(FConnect);
end;
finally
InternetCloseHandle(FSession);
end;
end;
var
Params: TDownloadParams;
Data: TMemoryStream;
begin
try
ZeroMemory(@Params, SizeOf(TDownloadParams));
Params.FileURL :=
"http://delphimaster.net/view/6-1184925658/";
Params.Proxy := "socks=203.186.54.161:1080";
Params.DownloadFrom := 150;
Params.NeedDataSize := 0;
Data := TMemoryStream.Create;
try
if DownloadFileEx(Params, Data) then
Data.SaveToFile("c:\test.htm");
finally
Data.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ": ", E.Message);
end;
end.
← →
digiman (2007-07-20 23:36) [4]Rouse_, big thx, прожевал, идею понял
← →
SlymRO © (2007-07-23 08:21) [5]уволят тебя, еще и с некрасивой статьей...
а если "много" накачаешь могут и к более жесткому ответу призвать...
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c