Witam.
Na wstępie zaznaczam, że piszę w WinAPI !
Od dłuższego czasu piszę sobie program, przeznaczenia jego jednak na razie nie chcę zdradzić bo nie wiem czy go skończę :)
Większość interfejsu już zrobiłem. Przyszła pora na sieć. No i nie wiem jak to zaprogramować.
Może wyjaśnię:
Program posiada kontrolkę ListView, do której użytkownik wrzuca linki.
Następnie użytkownik klika sobie opcję "Sprawdź linki".
Aplikacja powinna łączyć się z serwerem i uzyskać informacje:
- czy plik istnieje
- jaki jest jego rozmiar
a następnie, w osobnej kolumnie te informacje wyświetlić.
Kod HTML serwera rozpykałem. Zapytania POST to też na razie nie problem.
Zastanawia mnie jak wykonać połączenia.
Najpierw wymyśliłem, żeby zrobić tak:
Po kliknięciu na "Sprawdź linki" odpalam nowy wątek.
Wątek ten z każdego linku wyodrębnia:
- adres hosta
- ścieżkę do pliku
a następnie odpala wątek przekazując mu te informacje.
Nowy wątek wykonuje połączenie, odbiera dane od serwera, analizuje je i aktualizuje ListView po czym się wyłącza. (Oczywiście wątek używa socketów blokujących).
Przy czym użytkownik może wybrać ile maksymalnie wątków może być odpalonych.
Jeśli maksymalna liczba wątków została osiągnięta to w pierwszym wątku sprawdzam, czy któryś wątek: - przekroczył dozwolony czas (timeout dla connect, lub timeout dla (connect + czas transferu) )
- zakończył się
Uchwyty wątków, czas ich utworzenia itd. trzymam w tablicy dynamicznej (maks. ilość zależna od tego ile maks. wątków zdefiniował user).
Dalszych szczegółów nie będę opisywał. Dodam tylko, że w tym sposobie wychodzi masa kodu i zawiłości i nie udało mi się go wykonać prawidłowo. W dodatku taka ilość wątków to chyba nie jest dobry pomysł.
Jak typowe menedżery pobierania, przeglądarki itd. realizują kilkanaście (kilkadziesiąt) połączeń na raz?
Nie wydaje mi się, żeby wykorzystywały taką ilość wątków.
Może powinienem użyć socketów nie-blokujących?
Jak wy byście zrealizowali takie zadanie?
Może ma ktoś jakiś sprawdzony "schemat ideowy"?
Z pobieraniem docelowego pliku to już mniejszy problem, bo będę pobierał tylko jeden na raz.
A, gdyby kogoś dziwiło, czemu chcę sprawdzać kilka linków na raz zamiast jednego - myślę, że tak będzie sprawdzało szybciej na szybszych łączach.
Ostatnia sprawa, jak wiadomo, podczas ściągania pliku, będę musiał na bieżąco szukać określonych fragmentów kodu HTML, jak już znajdę wszystko co potrzebuję to rozłączę się (bo po co pobierać niepotrzebne dane).
Jak zrobić zarządzanie pamięcią dla pobieranych danych?
Bo przecież nie będę zapisywał do pliku, żeby za chwilę go odczytywać :)