Synapse+TCP - zamykanie połączenia

0

Mam sobie w programie klienta takie coś:

var skarpeta:TTCPBlockSocket;
[...]
skarpeta.Connect(ajpi,'666');
[...]
FreeAndNil(skarpeta);

Wszystko działa, jedyny problem polega na tym, że czasami mój serwer nie widzi tego że klient się rozłącza (mimo że wysyłam wcześniej pakiet "DAJSKONNEKT" to czasami nie zdąży on dojść przed zamknięciem skarpety.
Sprawdzanie czy TCP jest rozłączone zrobiłem tak: if not skarpeta_klienta.CanWrite($69 xor $69) then [rozlaczony]; - ale mimo że skarpeta jest rozłączona to CanWrite nadal zwraca true.

Proszę o jakieś porady jak serwer może wykryć że skarpeta jest rozłączona lub jak klient może rozłączać skarpete tak żeby serwer to "poczuł".

P.S. Tak, to jest napisane zabawnym stylem tylko po to abym otrzymał więcej odpowiedzi.
skarpeta=socket
DAJSKONNEKT=DISCONNECT
$69 xor $69=0
poczuł=wykrył
ajpi=IP

0

może zrób takie debugowanie że ty dajesz wiadomość diskonekta server odbiera i jak to odbierze to wysyła do klienta że odebrał i cie wiadomość i np klient ci się wyłącza ;]

0

może zrób takie debugowanie że ty dajesz wiadomość diskonekta server odbiera i jak to odbierze to wysyła do klienta że odebrał i cie wiadomość i np klient ci się wyłącza ;]

A co jak domniemany serwer jest już nieosiągalny? Dajskonekt ma to zrobić niezależnie od tego co się dzieje, i zrobić to szybko. A w końcu w normalnych rozwiązaniach jakoś to jest zrobione, że jak zamkniesz skarpetę to serwer to wykrywa, i z całą pewnością nic nie jest wysyłanego, bo jak pisałem botka IRC to serwer wykrywał rozłączenie Od razu (nawet jeżeli bot się zamykał 'awaryjnie' - exception).
Ja wiem że jest milion sposobów jak to obejść, ale ja nie chcę obejść, tylko to zrobić :p .

0

tak jak powiedziałeś serwer ma sam zmienić status klienta jak ten się rozłączy jeżeli tak nie jest to silnik serwera jest zły (ma błędy)

0

tak jak powiedziałeś serwer ma sam zmienić status klienta jak ten się rozłączy

I tak jest, tylko mi chodzi o to jak wykryć że on się rozłączył na poziomie TCP, bo mi pakiety dajskonnekt nie wystarczą (są zawodne i na pewno jest lepsza metoda rozłączania/wykrywania rozłaczania).
Nie rozumiem o co Tobie chodzi. Jeżeli uważasz że popełniłem jakiś prosty błąd, to jesteś conajmniej w błędzie. A ponieważ widzę że na Synapse się nie znasz, może daj odpowiedzieć komuś kto się zna, ok?

0
NieSynaptyczny napisał(a)

tak jak powiedziałeś serwer ma sam zmienić status klienta jak ten się rozłączy

I tak jest, tylko mi chodzi o to jak wykryć że on się rozłączył na poziomie TCP, bo mi pakiety dajskonnekt nie wystarczą (są zawodne i na pewno jest lepsza metoda rozłączania/wykrywania rozłaczania).
Nie rozumiem o co Tobie chodzi. Jeżeli uważasz że popełniłem jakiś prosty błąd, to jesteś conajmniej w błędzie. A ponieważ widzę że na Synapse się nie znasz, może daj odpowiedzieć komuś kto się zna, ok?

Ja akurat nie używam Synapse ale miałem podobny problem z rozłączaniem i brakiem informacji o tym fakcie. Moje rozwiązanie jest ... nawet skuteczne Socket error 10055 jednak jak sam zauważysz generuje pewien problem przy dużej ilości połączeń :)

0

Moje rozwiązanie jest ... nawet skuteczne

Mam to.Mam też system ponownego wysyłania uszkodzonych wiadomości. I mam też rozłączanie gdy nie idą message w odpowiednim tempie, mam też rozłączanie gdy błędy przesyłu są zbyt częste, mam też system zachowania kolejności wiadomości. I sporo więcej.
Uznałem że nie musicie wiedzieć o tym ile mam różnych systemów. Ale widać wasze rozwiązania po prostu nie mogą odpowiedzieć na problem, tylko chcą go jakoś ominąć. Zrozumcie, ten mój system połaczeń nie jest prostą nakładką, on mimo wszystko wykrywa rozłączenie (na podstawie ping timeout), ale chcę aby mógł też wykryć proste zamknięcie TCP, tak? I tylko to mnie interesuje...
Doceniam to że chcecie mi pomóc, ale naprawdę, nie jestem jakimś głupcem, żeby nie mieć ping timeout. Szukam nieomijającego rozwiązania, bo inne, te bardziej skuteczne mam, ale chcę mieć też te które wykryją normalne rozłączenie.
Jeszcze raz zdefiniuje problem:
Chcę móc zamknąć tak TCP z poziomu klienta, ażeby serwer to Od razu wykrył. I nieważne czy rozwiązanie jest client czy serverside. W każdym razie CanWrite(0); jakimś cudem nie działa (mimo że według dokumentacji miałoby).

0

Bump.

Może ktoś jednak zna rozwiązanie?

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