Turbo C++ i WWW

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » niedziela, 4 października 2009, 19:28

Dziwne. Pobrałem stronę za pomocą przeglądarki i niczym szczególnym się nie wyróżnia.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » niedziela, 4 października 2009, 19:31

Wiem, jest to zwyczajna strona. Jedyna różnica, to jej długi adres. Twoją stronę pobiera bez problemu.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » niedziela, 4 października 2009, 21:58

Tu nie chodzi o krzaczki, gdyż akurat ten problem rozwiązuje funkcja Utf8Decode, problem stanowią kwadraciki, które są znakami końca linii.

Ok, przeoczyłem, że chodzi o znaki końca linii. Co do reszty posta, podtrzymuję to co napisałem.

Może zamiast się wymądrzać wreszcie napiszesz coś konstruktywnego.

No to dałem. Co zresztą sam na początku oprotestowałeś, żeby później, po wielu postach, przyznać mi rację dając kod, który jest podobny do mojego. W zasadzie reszta tego tematu, począwszy od mojego posta, to kręcenie się wokół rozwiązanego problemu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » poniedziałek, 5 października 2009, 07:59

Co zresztą sam na początku oprotestowałeś, żeby później, po wielu postach, przyznać mi rację dając kod, który jest podobny do mojego. W zasadzie reszta tego tematu, począwszy od mojego posta, to kręcenie się wokół rozwiązanego problemu.


Ten kod opracowałem już dawno temu i umieściłem w serwisie, dlatego poszukiwałem nowych rozwiązań. Przyznaję poległem na tym polu, więc na razie pozostaje rozwiązanie z wczytywaniem plików w częściach.

A Ty zamiast wałkować w kółko to samo może mógłbyś się skupić na problemie.

Powiem tak to jeszcze nie koniec problemu. Zacząłem testować sobie rozwiązania i przy tej stronie:

Kod: Zaznacz cały
Url = "http://www.bet-at-home.com/odd.aspx?action=toggleEventGroup&SportID=1&EventGroupID=222";


Wysypuje mi się w tym miejscu:

Kod: Zaznacz cały
    IStream* pStream;
    URLOpenBlockingStream(0, URL.c_str(), &pStream, 0, 0);
    std::auto_ptr<TOleStream> oStream(new TOleStream(pStream));
    Form4->Memo1->Lines->LoadFromStream(oStream.get());    // <-- BŁĄD !!!


Drugie z prezentowanych rozwiązań wczytuje część podanej strony.
Jednak po kilku niepowodzeniach druga metoda wczytała całość.


Drugie rozwiązanie to te podobne do Twojego. Problem wydaje się być rozwiązany, ale dopóki nie będzie wiadomo, czemu akurat przy tej stronie tak się dzieje, to problem zawsze może się pojawić ponownie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » poniedziałek, 5 października 2009, 10:26

A Ty zamiast wałkować w kółko to samo może mógłbyś się skupić na problemie.

To samo czyli co? 8-)

Kod ze strumieniem ma jedną zasadniczą wadę: brak jakiejkolwiek obsługi błędów. Zakłada, że URLOpenBlockingStream zawsze zadziała, co w przypadku kwestii związanych z siecią jest sporą naiwnością. Czyli jeśli już, to:
Kod: Zaznacz cały
IStream* pStream;

if(URLOpenBlockingStream(0, URL.c_str(), &pStream, 0, 0) == S_OK)
{
   std::auto_ptr<TOleStream> oStream(new TOleStream(pStream));
   Form4->Memo1->Lines->LoadFromStream(oStream.get());
}
else
{
   //DAMN!!!
}


Drugie z prezentowanych rozwiązań wczytuje część podanej strony. [...]

Drugie rozwiązanie to te podobne do Twojego. [...]

U mnie zassało całość. W prawdzie testowałem po 21, wtedy link miał już nie działać, ale jaką bym sobie stronę nie wymyślił, to ściąga bez problemu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » poniedziałek, 5 października 2009, 19:14

Zakłada, że URLOpenBlockingStream zawsze zadziała,
Faktycznie twoje rozwiązanie pokazuje, że jest problem nie w tym miejscu gdzie ja pokazywałem tylko wcześniej:
Kod: Zaznacz cały
if (URLOpenBlockingStream(0, Url.c_str(), &pStream, 0, 0) == S_OK)
Nie wiem czy dobrze kombinuje ale przetestowałem kilka adresów:
Kod: Zaznacz cały
std::string Url = "http://programowanie.cal.pl/forum/index.php", p;
//Url = "http://www.bet-at-home.com/odd.aspx?action=toggleEventGroup&SportID=1&EventGroupID=222";
Url = "http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/idx.html";
Url = "http://www.dotnetheaven.com/uploadfile/mahesh/commonwininetapi05242005064319am/commonwininetapi.aspx";
//   Url = "http://www.microsoft.com/downloads/details.aspx?familyid=413744D1-A0BC-479F-BAFA-E4B278EB9147&displaylang=en";
Url = "http://tv.wp.pl/programy.html?katn=Lista+kana%B3%F3w&ticaid=18dea";
//Url = "http://sms.idea.pl/default.aspx?SENDER=&RECIPIENT=&SHORT_MESSAGE=&err=inbox_was_deleted";
Zakomentowane to te które nie działają. I dochodzą do wniosku, że chodzi o znak "&". Jeśli występuje więcej takich znaków to dana strona nie działa. Więc samo rozwiązanie URLOpenBlockingStream ma jakiś problem.

PS jednak teorię tą szybko obala następująca strona:
Kod: Zaznacz cały
Url = "http://www.google.pl/search?hl=pl&client=firefox-a&rls=org.mozilla:en-US:official&hs=Rbr&q=URLOpenBlockingStream&start=20&sa=N";
tak, czy siak problem wywołuje URLOpenBlockingStream.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » poniedziałek, 5 października 2009, 21:32

Faktycznie przy stronie microsoftu URLOpenBlockingStream nie zawsze działa. Być może konieczne jest użycie IBindStatusCallback, żeby poprawnie zareagować na jakiś problem z pobieraniem zawartości. Opcja z InternetReadFile prawie zawsze działa... W zasadzie to zawsze działa, ale nie zawsze ściąga tę zawartość, o którą chodzi. Myślę, że wiem gdzie leży problem, ale muszę jeszcze zrobić parę testów, wtedy napiszę coś konkretnego (problem w tym, że muszę trafić na ten moment, kiedy nie czyta mi tego, co chcę, a to nie występuje za często :? )

I dochodzą do wniosku, że chodzi o znak "&"

Ten znak służy do rozdzielania parametrów, jakie klient przekazuje do serwera w URL-u:

    <adres>?<parametr>=<wartość>&<parametr>=<wartość>&<parametr>=<wartość>
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » wtorek, 6 października 2009, 13:21

Dobra, tu masz kod otwierający połączenie dla InternetReadFile:
Kod: Zaznacz cały
HINTERNET http_open_url(HINTERNET session,const char *address)
{
   HINTERNET   hUrl;
   char      url_str[512];
   int         max_refreshes = 5;

   strcpy(url_str,address);

   while(hUrl = InternetOpenUrl(session, url_str, NULL, 0, 0, 0))
   {
      char   data[512];
      DWORD   size = 512;
      float   time;

      if(HttpQueryInfo(hUrl,HTTP_QUERY_REFRESH,(LPVOID)data,&size,NULL))
      {
         int res = sscanf(data,"%f; url=%s",&time,url_str);
         if(res <= 0)
         {
            InternetCloseHandle(hUrl);
            return NULL;
         }
         
         if(time > 1.0f)break;
         InternetCloseHandle(hUrl);
         if(--max_refreshes < 0)return NULL;
         Sleep(time * 1000.0);
      }
      else break;
   }

   return hUrl;
}

Testowałem to tylko na stronie microsoft'u, bo na innych nie występuje u mnie ten problem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » wtorek, 6 października 2009, 18:48

Trochę nie zrozumiałeś. To co przedstawiłeś to ja mam, Cyfrowego rozwiązanie działa. Mówimy o bibliotece wininet!
Ale nie działa jak sam zauważyłeś rozwiązanie oparte o urlmon.h.
Chciałem mieć dwa rozwiązanie. Widać muszę zrezygnować z urlmon.h, ze względu na problemy ze strumieniem przy dłuższych adresach internetowych i tak właściwie nie wiadomo co jest przyczyną.

Jeszcze raz wszystkim Wam dziękuje za pomoc. Myślę, że kilka postów było offtop, ale dla mnie ważne, że uzyskałem to co powinienem.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron