Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

Закачка файла через несколько прокси   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
2-1205525727
TaHdeR
2008-03-14 23:15
2008.04.13
Как свьязать DataSource и Query?


2-1205908465
zorik
2008-03-19 09:34
2008.04.13
Доступ класса к главному класса и к его свойствам


2-1206015131
WildBoolean
2008-03-20 15:12
2008.04.13
TListBox +OnDrawItem


2-1205655917
NewSer
2008-03-16 11:25
2008.04.13
Как проверить уникальность вводимого в ключевое поле значения?


2-1206029759
wowa1
2008-03-20 19:15
2008.04.13
TImageList.Draw