Dlaczego jeśli wysyłam pakiet http z pomocą TClientSocket (port ustawiony na 80), to zdarzenie OnRead nie działa??
Działa.
Nie działało dlatego, że ustawiałem Active na true dopiero w kodzie, tuż przed wysłaniem pakietu... nie wiem, może nie zdążył się połączyć?? Ustawiłem w Object Inspektorze i wszystko gra... nie chcę zakładać nowego tematu, więc zadam jeszcze jedno pytanie, z góry dzięki za odpowiedzi. Dlaczego jak wysyłam pakiet i przychodzi odpowiedź, to na kolejny już nie przychodzi?? Muszę się rozłączyć/połączyć i wtedy oczywiście znowu mogę odbierać, ale to chyba nienajlepsze rozwiązanie... Dzieje się tak tylko z niektórymi hostami, np "www.divx.pl".
Bo pewnie te hosty zrywają połączenie. :-)
AD1. Jeżeli do łączenia się używasz komponentu TClientSocket, to dane do servera HTTP (zapytanie) wysyłaj w zdarzeniu OnConnect.
AD2. Przecież protokół HTTP przewiduje zamknięcie połączenia po prawidłowym wysłaniu odpowiedzi na zapytanie (czyli np. server wysyła ci stronę, którą podałeś jako argument w GET i gdy skończy zamyka połączenie).
Dzięki, o taką informację mi chodziło... w takim razie nie pozostaje nic innego jak sprawdzać czy host zrywa połączenie (jedyny sposób na to to chyba wysłanie pakietu i czekanie przez jakiś czas na odpowiedź, tak?) i jeśli tak robi to wznawiać połączenie po każdym odebraniu...
To zależy... Jeżeli korzystasz z komponentu TClientSocket to masz tam zdarzenie OnDisconnect. Jeżeli korzystasz z np. WinSock to możesz chyba użyć GetLastError() [czy jakoś tak].
Faktycznie, OnDisconnect pokazuje, że się rozłączył... zraziłem się do tego zdarzenia po tym jak zauważyłem, że nie wykrywa rozłączenia z internetem... musiałem sam z pomocą RAS je wykrywać... a tu taka niespodzianka, wreszcie się do czegoś przydało. :-)
Dopisane: Problem pojawia się, gdy połączenie po zakończeniu wysyłania nie jest przerywane... bo skąd wtedy mam wiedzieć, czy to już koniec pakietu? Jest flaga FIN w protokole TCP, ale ona nie dość, że nie zawsze jest ustawiana wtedy, kiedy już nic więcej nie przyjdzie, to jeszcze z poziomu ClientSocketa nie mam do niej dostępu. Jest jakiś sposób? Z góry dzięki za odpowiedzi.