WinInet pobieranie wielu plików

0

Wpadłem w bagno i od kilku godzin nie mogę się sam wydostać, teraz dopiero wołam o pomoc.

Pobieram pliki z jednego serwera w wątkach, wszystko jest w porządku, gdy pobieram max 2 pliki jednocześnie, trzeciego już nie chce pobierać.
Prawdopodobnie kod zatrzymuje się na:

hURL:= InternetOpenUrl(hInter, PChar(tURL), nil, 0, 0, 0);

Nie mogę uporać się z problemem. Gdy mam na liście np. 12 plików i ustawię, by ssał 2 pliki jednocześnie to pobiera dobrze i pobierze z czasem te 12 plików, ale gdy nakażę mu ssać 3 pliki na raz to ssie tylko dwa, trzeciego nie tyka wcale (tzn. wątek się wykonuje i zatrzymuje prawdopodobnie na powyższej linii i stoi...).

Sprawdziłem, czy np. w firefoxie (i jDownloaderze) pobiorę jednocześnie np. 3 lub więcej plików i udaje się więc serwer chyba nie ogranicza ilości połączeń no i tu wysiadam. :-(

//
dziwne to wszystko, nie rozumiem w jaki sposób firefox, czy jdownloader nawiązują dowolną ilość z tym serwerem, a ja mogę max dwa :(
Dodałem do listy pliki z innego serwera (lepiej późno niż wcale) i pobierało mi i 4 pliki na raz (ale dwa z tylko z tego głupiego serwera, z innych dowolną ilość).

Zatem problem rozwiązany. Ale czy mógłby mi ktoś wytłumaczyć jakim cudem firefox i inne programy pobierają jednocześnie dowolną ilość plików? :/

0

Pewnie masz starszą wersję IE, bo moduł WinInet korzysta - o ile się nie mylę - z rozwiązań Internet Explorera.
Wiem, że domyslnie IE nie pobierze więcej niż dwóch plików na raz, ale można było tę wartość zwiększyć przez
edycję wpisu w Rejestrze. Nie pamiętam jaki klucz, ale kiedyś jeszcze pod Windows '98 to robiłem. Jednak ja,
polecil bym Tobie skorzystać z pakietu Synapse lub ostatecznie Indy. Synapse jest szybsze na pewno, niż cały
ten modul WinInet. Przykłady, dokumentację i same pakiety można znaleźć w google. Przynajmniej Synapse.
Indy trochę ciężej, długo się ładuje strona, ale powinno być pod poniższym adresem i pobieranie wielu plików
na raz powinieneś w tych pakietach zrobić beż większych problemów, wraz z pokazaniem przebiegu pobrania.
http://web.archive.org/web/20070122043958/www.atozed.com/indy/Plus/Files.en.aspx

0

olesio jak zwykle aktywny :), dzięki za informacje, ach ten podły microsoft, żeby nawet pod windą 7 wprowadzali ograniczenia (pewnie wkręcą, że to dla bezpieczeństwa).

A ten synapse to zestaw komponentów, coś jak indy, tyle, że trochę inne np. ma swoje odpowiedniki RichEditów z kolorowaniem składni i inne bajery (nigdy nie korzystałem z tego)? czy może to tylko jedna rzecz do ssania plików (czyli odpowiednik TidHttp)...
Nie przeglądałem przykładowych kodów, ale jest dość prosty w użyciu? bo na wininet prędkość pobierania pliku (kB/s) sobie sam napisałem (choć jestem początkujący + inne dane). Jutro chyba rzucę okiem na tego synapse ;]

0

Synapse to pakiet komponentów niewizualnych, ale zdaniem moim, Miśkad i nie tylko, o wiele lepszy i szybszy,
a także o niemal identycznych możliwościach jak Indy. Pobierz z http://synapse.ararat.cz/doku.php/download i
zobacz dokumentację oraz przykłady. Obsługuje FTP, HTTP, wysyłanie i odbieranie e-maili, a także obsługję TCP
oraz UDP, czego ja do tej pory nie próbowałem, ale można w nim napisać i aplikację klient - serwer. A taki kod
jak poniżej pobierze Tobie plik z podanego adresu z obsługą przekierowania, jak widać to nic skomplikowanego.

//...
const
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10';

procedure DownloadToFile(const URL : string; const FileName : string);
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  Str, DirectLink : string;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          DownloadToFile(DirectLink, FileName);
        end;
    else
      SynHttp.Document.SaveToFile(FileName);
    end;
  finally
    SynHttp.Free;
  end;
end;
0

o to widzę, że ładne, pobiorę później ;)

//na dole instrukcja co do tego rejestru:
http://support.microsoft.com/kb/282402/pl
//tak tylko piszę

1 użytkowników online, w tym zalogowanych: 0, gości: 1