nieblokujący socket nie obsługuje http?

0

Dlaczego jeśli wysyłam pakiet http z pomocą TClientSocket (port ustawiony na 80), to zdarzenie OnRead nie działa??

0

Działa.

0

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".

0

Bo pewnie te hosty zrywają połączenie. :-)

0

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).

0

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...

0

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].

0

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.

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