Главная страница
    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.007 c
3-1195575987
ari_9
2007-11-20 19:26
2008.04.13
Длинные (несколько суток) читающие транзакции в FB. Как лучше ?


15-1203955152
Ega23
2008-02-25 18:59
2008.04.13
Есть ли в PHP5 аналог forward?


2-1205923008
Pavelkq
2008-03-19 13:36
2008.04.13
OnRightClick для CheсkListBox


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


6-1185177400
Dmitry_177
2007-07-23 11:56
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский