Socket, pobieranie zawartosci www

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

Re: Socket, pobieranie zawartosci www

Postprzez rompi » wtorek, 16 czerwca 2009, 15:53

Witam,

Jestem pierwszy raz na net forum gdyz aktualnie potrzebuje zrobic taki program do pobierania strony . Moja specjalizacja to bardziej telekomunikacja i nie mam jeszcze opanowanego srodowiska programistycznego
Mozna by przeslac mi taki kod dzialajacego lub w nie w pelni programu(tak zebym mogł wkleic ;)
Sprubuje tez popatrzyc moze znajde jakies rozwiazanie

Rom
Avatar użytkownika
rompi
Bladawiec
Bladawiec
 
Posty: 1
Dołączył(a): wtorek, 16 czerwca 2009, 15:35
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez Miroo_007 » wtorek, 16 czerwca 2009, 18:15

Hmmm... już dawno nie było takiego odzewu na forum. Z tego wynika, że trzeba mieć tylko fajnego awatara i po sprawie.

Co do tematu. Czy przypadkiem nie rwie ci połączenia w trakcie ściągania strony?

rompi napisał(a):Mozna by przeslac mi taki kod dzialajacego lub w nie w pelni programu(tak zebym mogł wkleic ;)
Sprubuje tez popatrzyc moze znajde jakies rozwiazanie

Zadawaj pytania w nowym wÄ…tku.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez shycat » wtorek, 16 czerwca 2009, 19:18

Dziwnie to Ty przedstawiłaś problem. Brak sensownego kodu aby go można było przetestować (to co ja napisałem do testów działa OK), brak adresu strony na której są problemy. Może problem sprawia kawałek kodu którego nie wkleiłaś, a zresztą …



---

Twoja wiadomosc lekko mnie rozsmieszyla i udowadnia to, ze albo nie czytasz postow, ktore pisze, albo jestes tak slabym programista, ze nie jestes w stanie zrozumiec problemu ktory przedstawilam... o jakim kawalku kodu mowisz, o procedurze dla buttonu, ktory wywoluje:

Socket->ReceiveText();

... to raczej bez sensu... co do adresu strony -> pisalam przeciez, ze problem wystepuje na roznych stronach JAK I ROWNIEZ NA LOCALHOSCIE, przy uzyciu lokalnego serwera -> czego chyba nie trudno sie domyslic ... podalam nawet kawalek kodu php... jak nie masz nic do powiedzenia, co mogloby rozwiazac problem to nie pisz glupich postow... to, ze jestes tu moderatorem to nie znaczy, ze jestes tu "Bogiem"...

Co do tematu. Czy przypadkiem nie rwie ci połączenia w trakcie ściągania strony?


Nie, nie zrywa na 100% ... -> sprawdzalam tez na localhoscie ;) ...
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: ÅšlÄ…sk
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez Miroo_007 » wtorek, 16 czerwca 2009, 19:48

Witold napisał(a):Dziwnie to Ty przedstawiłaś problem. Brak sensownego kodu aby go można było przetestować (to co ja napisałem do testów działa OK), brak adresu strony na której są problemy. Może problem sprawia kawałek kodu którego nie wkleiłaś, a zresztą …

Witold ma rację. Musisz pokazać więcej. Sam kod nie wystarczy:
Kod: Zaznacz cały
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
      AnsiString odp=Socket->ReceiveText();
      //....
}

Pokaż jak łączysz odpowiedzi od serwera (co robisz ze zmienna odp). Pokaż parametry połączenia. Czasem błąd leży tam gdzie się nawet nie spodziewasz.
shycat napisał(a):Twoja wiadomosc lekko mnie rozsmieszyla i udowadnia to, ze albo nie czytasz postow, ktore pisze, albo jestes tak slabym programista, ze nie jestes w stanie zrozumiec problemu ktory przedstawilam... o jakim kawalku kodu mowisz, o procedurze dla buttonu, ktory wywoluje:

Tylko nie pobijcie siÄ™ na tym forum...
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez Miroo_007 » wtorek, 16 czerwca 2009, 20:11

Zrób taki test. Po otrzymaniu całej treści strony usuń fragment tekstu (odp.Delete(1,100)) i sprawdź poprzez Evaluate/Modify czy czasem część strony, która wcześniej nie mieściła się w zmiennej odp nie jest już widoczna.

Miroo_007 napisał(a):
Kod: Zaznacz cały
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
       TStringList *Lista = new TStringList;
       Lista->Add(Socket->ReceiveText());
       //....
}

shycat napisał(a):rozwiazanie ktore mi podales niestety nie dziala...

Sorry mój błąd. Powinno być coś takiego:
Kod: Zaznacz cały
//----------Unit1.h----------
class Form1 {
     public:
          TStringList *Lista;
}
//---------Unit1.cpp--------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
      Lista = new TStringList;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
     delete Lista;
}
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
       Lista->Add(Socket->ReceiveText());
       //....
}
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez Cyfrowy Baron » wtorek, 16 czerwca 2009, 22:06

Problemem może być strona, którą próbujesz pobrać, gdybyś np. próbowała pobrać stronę index.php z tego forum, to też otrzymasz kawałek kodu, akirat ten który zawiera plik index.php, a nie cała stronę główną forum.
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: Socket, pobieranie zawartosci www

Postprzez Witold » wtorek, 16 czerwca 2009, 23:59

shycat napisał(a):Twoja wiadomosc lekko mnie rozsmieszyla...


Cóż, chciałem ci pomóc, myślę sobie - protestuje, może się czegoś nauczę. Postanowiłem że spróbuję odtworzyć problem:
1. Nie umieściłaś kodu który pokazywał by łączenie, napisałem go sobie.
2. Nie podałaś strony na której problem występuje tylko "jezeli kod jest wiekszy, pobierany jest tylko kawalek" – dobra wskazówka! Wybrałem http://www.wp.pl. Około 140kB, dobrze wybrałem ? A jeszcze twój localhost -> ale tam sobie protestować nie mogłem, mylę się ?
3. Odbieranie danych: hura, mam kawałek kodu metody: void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) - niestety za mało, nie wiem jak dane są łączone (jak pisałem, testowałem - dane z http://www.wp.pl przychodziły w 35 kawałkach). Odbieranie danych - musiałem napisać sobie sam.
4. Nie wiedziałem też jak sprawdzałaś ile danych zostało pobrano, niby trudno się pomylić, ale czasami i takie rzeczy się zdarzają. To też sobie napisałem.
5. Czas na testowanie – u mnie wszystko OK (cała strona znalazła się w Memo1).

Wniosek: błąd jest prawdopodobnie u ciebie w kodzie, nie mogłem lepiej sprawdzić, bo olałaś moje pytania/prośby (zbyt banalne/nudne? – wybacz). Dla twojej wiadomości jestem słabym "programistą" i nie jestem moderatorem.

shycat napisał(a):o jakim kawalku kodu mowisz, o procedurze dla buttonu, ktory wywoluje:
Socket->ReceiveText();


Wcześniej Socket->ReceiveText(); umieściłaś w ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket), to nie to samo. I jak można zrozumieć o ci chodzi ? A ty potrafisz czytać z zrozumieniem ? Prosiłem o kod który mógłbym przetestować, to czego nie podałaś wypisałem wyżej.

shycat napisał(a):co do adresu strony pisalam przeciez, ze problem wystepuje na roznych stronach JAK I ROWNIEZ NA LOCALHOSCIE, przy uzyciu lokalnego serwera czego chyba nie trudno sie domyslic ... podalam nawet kawalek kodu php


Ja prosiłem o adres aby sprawdzić czy kod który napisałem poradzi sobie z daną stroną. Nie prosiłem o kod php.
shycat napisał(a):jak nie masz nic do powiedzenia, co mogloby rozwiazac problem to nie pisz glupich postow.

Konkretnie które moje wypowiedzi były poza tematem/głupie ?
shycat napisał(a):.. to, ze jestes tu moderatorem to nie znaczy, ze jestes tu "Bogiem"...

Nie jestem moderatorem, na podstawie czego twierdzisz że czuję się tu "Bogiem"...
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez Miroo_007 » Å›roda, 17 czerwca 2009, 03:50

Witold napisał(a):...łączysz te fragmenty z sobą ?

np
Kod: Zaznacz cały
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
}

shycat napisał(a):Co do laczenia... kod ktory podales niczego nie laczy...

Mylisz się. Ten kod łączy treść. Inaczej mówiąc dodaje nową treść do już istniejącej.

To co was różni to AnsiString i TStringList. Shycat używa AnsiString, a Witold TStringList. Moim zdanie problem nie polega na typie AnsiString tylko bardziej na przeładowanym operatorze "=" dla tego typu. Shycat wykorzystuje ten operator do przypisania i być może ten operator nie jest przystosowany do dużych rozmiarów danych. Jednym z rozwiązan jest to co pokazałem w poprzednim poście, czyli dopisywanie danych do obiektu TStringList.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Socket, pobieranie zawartosci www

Postprzez Cyfrowy Baron » czwartek, 18 czerwca 2009, 12:14

Trochę się już pogubiłem w tym wątku, ale Miroo_007 może mieć rację.

Witold napisał:
3. Odbieranie danych: hura, mam kawałek kodu metody: void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) - niestety za mało, nie wiem jak dane są łączone (jak pisałem, testowałem - dane z http://www.wp.pl przychodziły w 35 kawałkach). Odbieranie danych - musiałem napisać sobie sam.


właśnie w tym rzecz, przepisując dane przesyłane w pakietach do jednej zmiennej AnsiString powoduje że zmienna zapamiętuje ostatni pakiet, więc chyba mozna tak:

Kod: Zaznacz cały
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
}


albo też tak:

Kod: Zaznacz cały
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
  AnsiString odp += Socket->ReceiveText();
}


Nie mam socketów, więc tego nie sprawdzę, a gdy je kiedyś miałem, to i tak ich nie używałem, więc mogę się oczywiście mylić.
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: Socket, pobieranie zawartosci www

Postprzez Darek_C++ » wtorek, 7 lipca 2009, 15:59

Polecam bibliotekę wininet i funkcję do obsługi żądań HTTP
Nie ma problemu z pobieraniem "dużych" stron kodowanych w UTF-8, iso-8859-2.
W razie problemów z polskimi znakami można skorzystać z funkcji utf8ToAnsi.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Poprzednia strona

Powrót do Aplikacje sieciowe

Kto przeglÄ…da forum

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