Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закачка файла через несколько прокси [D5, WinXP]


digiman ©   (2007-07-20 14:00:00) 

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

Вопрос: Нужно написать прогу для закачки со сцылки через несколько компов-проксей одновременно, т.е. по кускам


SlymRO   (2007-07-23 08:21:00) [1]

уволят тебя, еще и с некрасивой статьей...
а если "много" накачаешь могут и к более жесткому ответу призвать...


digiman   (2007-07-20 23:36:00) [2]

Rouse_, big thx, прожевал, идею понял


Rouse_   (2007-07-20 16:19:00) [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://www.delphimaster.ru/cgi-bin/forum.pl?id=1184925658&n=4';
   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.


Rouse_   (2007-07-20 16:10:00) [4]

Удалено модератором
Примечание: Дубль...


umbra   (2007-07-20 14:43:00) [5]

поищите на тему http-заголовка ContentRange.


Наверх

Титульная страница Поиск, карта сайта Написать письмо