Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.008 c
2-1205431955
maxs
2008-03-13 21:12
2008.04.13
TTreeView с CheckBox ами


15-1204396300
Пробегал...
2008-03-01 21:31
2008.04.13
Кто-нибудь видел такую ошибку?


4-1186753790
Alkid
2007-08-10 17:49
2008.04.13
OpenNtsmSession + 64-bit Windows XP


15-1203812771
Mailer
2008-02-24 03:26
2008.04.13
Как работать с архивами *.tar.bz2 без дополнительных dll и


2-1206023020
andreil
2008-03-20 17:23
2008.04.13
Как получить параметры для уже выполняющейся программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский