TCP alive detection
12 отговора
495 прегледа
TCP alive detection
Niakoj specialist po TCP znae li kak moga da razbera dali
edin socket connection e ziv, pri polozenie, che po nego ne
proticha nikakyv traffic.
Primerno: imam si TCP server i si slusham v blokirash rezim
bez timeout. Togava ako klientyt mu spre toka, socketyt shte
si ostane otvoren i danni nikoga niama da pristignat, a serveryt
nikoga niama da razbere, che ima problem s klienta.
Probvah sas SO_KEEPALIVE, ama ne stava! Keep-alive
paketi po specifikacia se prashtat na 2 chasa i ne moze da
se zadade po-chesto da se prashtat, taka che tova prosto ne
pomaga.
Ima li drug nachin osven na nivo protokol da si napravia
PONG-PONG? Tova znachitelno shte uslozni klienta i server-a
i shte predizvika sinhronizacionni problemi. Kofti e. Ima li
kulturen nachin ili niama?
edin socket connection e ziv, pri polozenie, che po nego ne
proticha nikakyv traffic.
Primerno: imam si TCP server i si slusham v blokirash rezim
bez timeout. Togava ako klientyt mu spre toka, socketyt shte
si ostane otvoren i danni nikoga niama da pristignat, a serveryt
nikoga niama da razbere, che ima problem s klienta.
Probvah sas SO_KEEPALIVE, ama ne stava! Keep-alive
paketi po specifikacia se prashtat na 2 chasa i ne moze da
se zadade po-chesto da se prashtat, taka che tova prosto ne
pomaga.
Ima li drug nachin osven na nivo protokol da si napravia
PONG-PONG? Tova znachitelno shte uslozni klienta i server-a
i shte predizvika sinhronizacionni problemi. Kofti e. Ima li
kulturen nachin ili niama?
Re: TCP alive detection
Доколкото знам, няма. Можеш да правиш heartbeat, но както сам казваш това ще предизвика синхронизационни проблеми. Можеш и да ползваш UDP и сам да си правиш ретрансмисиите. Има и един сравнително нов протокол, SCTP, при който можеш да имаш отделен канал за heartbeat-а, но той все още не е стандартна част от ОС-овете и трябва да си търсиш SCTP стек.
Re: TCP alive detection
A kakva OS polzvash?
Ako si pod Linux se seshtam, che pri razpadane na TCP sesiyata, select-a ti izliza s indikaciya, che imash promyana po socket-a. Sled koeto, kato se opitash da prochetesh neshto ot nego s recv ti vryshta greshka (errno=ENOTCONN ili neshto takova). Taka razbirash, che connection-a ti se e razpadnal ... Pravil sym go otdava i si spomnyam che raboteshe, no moje i da imam netochnosti v momenta. Vse-pak proveri man pages na select i recv ...
Ako si pod Windows - sorry, ama ne znam ...
Ako si pod Linux se seshtam, che pri razpadane na TCP sesiyata, select-a ti izliza s indikaciya, che imash promyana po socket-a. Sled koeto, kato se opitash da prochetesh neshto ot nego s recv ti vryshta greshka (errno=ENOTCONN ili neshto takova). Taka razbirash, che connection-a ti se e razpadnal ... Pravil sym go otdava i si spomnyam che raboteshe, no moje i da imam netochnosti v momenta. Vse-pak proveri man pages na select i recv ...
Ako si pod Windows - sorry, ama ne znam ...
Re: TCP alive detection
tova, koeto opisvash e taka, ama ima edna osobenost.
ako vryzkata se razpadne poradi zatvariane na socketa, se prashta FIN paket i otsreshtanata strana razbira kakvo e stanalo.
ako obache vryzkata ne se razpadne, a liniyata se razrushi, primerno niakoj se spyne v mrezovia kabel, togava socketyt si ostava otvoren i niama nachin da razberesh che ima problem, osven ako ne se opitash da izpratish neshto po nego.
ako vryzkata se razpadne poradi zatvariane na socketa, se prashta FIN paket i otsreshtanata strana razbira kakvo e stanalo.
ako obache vryzkata ne se razpadne, a liniyata se razrushi, primerno niakoj se spyne v mrezovia kabel, togava socketyt si ostava otvoren i niama nachin da razberesh che ima problem, osven ako ne se opitash da izpratish neshto po nego.
Re: TCP alive detection
priatel mi kaza edna hubava ideya. da puskam OOB (urgent) paketi ot vreme na vreme. po princip ako tozi otsreshta ne gi ochakva, toj shte gi ignorira, taka che te ne prechat, no ako onia otsreshta go niama nikakyw, niama da dojde ACK paket i TCP/IP stack-a shte se useti, che socketyt se e razrushil.
Re: TCP alive detection
ако стане тая работа сас ООВ-то пусни един пост плс че и ас се интересувам от такива шмекерии.
Re: TCP alive detection
probvah go na JDK 1.4.2_03. tova s OOB paketite ne stava!
Prashtam si az OOB paketi, ama ako toya otsreshta go niama, te niamat nikakvo vlianie. Vmesto da dade SocketException s message "Connection reset", ne dava nishto. Typo. Yavno neshto tezi OBB paketi sa po-specialni i ne hvashtat razruchen socket. da ne bi da sa kato UDP? ako stignat - stignat.... a pyk moze i Java-ta neshto da gi osira i da gi ignorira. Ne znam.
Inache tova sas SO_KEEPALIVE flaga bachka, ama dava exception "Connection reset" sled 2 chasa (tova pod Windows XP sym go probval).
yavno triabva v protokola na application level da se puska PING-PONG ot vreme na vreme. to nali zatova FTP protokola ima komanda NOOP.
Prashtam si az OOB paketi, ama ako toya otsreshta go niama, te niamat nikakvo vlianie. Vmesto da dade SocketException s message "Connection reset", ne dava nishto. Typo. Yavno neshto tezi OBB paketi sa po-specialni i ne hvashtat razruchen socket. da ne bi da sa kato UDP? ako stignat - stignat.... a pyk moze i Java-ta neshto da gi osira i da gi ignorira. Ne znam.
Inache tova sas SO_KEEPALIVE flaga bachka, ama dava exception "Connection reset" sled 2 chasa (tova pod Windows XP sym go probval).
yavno triabva v protokola na application level da se puska PING-PONG ot vreme na vreme. to nali zatova FTP protokola ima komanda NOOP.
Re: TCP alive detection
проблемът ти какъв е - че докато не направиш send, не разбираш, че кабелът е издърпан ли?
Re: TCP alive detection
tova s OOB paketite go probvah. Stranno (za men), no ne bachka.
Testvah s JDK 1.4.2_03 pod Windows XP. Napravih taka:
while (not interrupted) {
read_form_socket(timeout = 5 sec.);
if (read_timeout)
send_OOB_packet_to_socket()
else
process_read_data()
}
Rezultatyt e che ako izvadya mrezovia kabel, tezi OOB paketi ne predizvikvat exception, t.e. ne useshtat che niama vryzka. Imam chuivstvoto, che tezi paketi se dostaviat bez potvyrzdenie ili che Java-ta neshto ne implementira kato horata.
Mezdu drugoto ako klientyt e Windows telnet, paketite OBB se poluchavat zaedno s drugite danni, no ako klientyt mi e Java, ima opcia dali gi sikam tezi OOB paketi ili ne.
Testvah s JDK 1.4.2_03 pod Windows XP. Napravih taka:
while (not interrupted) {
read_form_socket(timeout = 5 sec.);
if (read_timeout)
send_OOB_packet_to_socket()
else
process_read_data()
}
Rezultatyt e che ako izvadya mrezovia kabel, tezi OOB paketi ne predizvikvat exception, t.e. ne useshtat che niama vryzka. Imam chuivstvoto, che tezi paketi se dostaviat bez potvyrzdenie ili che Java-ta neshto ne implementira kato horata.
Mezdu drugoto ako klientyt e Windows telnet, paketite OBB se poluchavat zaedno s drugite danni, no ako klientyt mi e Java, ima opcia dali gi sikam tezi OOB paketi ili ne.
Re: TCP alive detection
da, tochno taka, dokato ne pratia neshto po soket-a ne moga da znam dali kabelyt e izdyrpan ili ne. zasega si reshavam problema s prashtane na PING message ot server-a kym vsichki klienti pri 5 minuti lipsa na aktivnost, no tova uslozniava i server-a i klienta i iziskva dopylnitelni usilia za spraviane sas sinhronizacionni problemi.
Re: TCP alive detection
абе тука в едни сорсове гледам следната делавера:
bool socket_disconnected( int s )
{
unsigned long read;
ioctlsocket( s, FIONREAD, &read );
return read == 0;
}
не съм го пробвал обаче...
bool socket_disconnected( int s )
{
unsigned long read;
ioctlsocket( s, FIONREAD, &read );
return read == 0;
}
не съм го пробвал обаче...
Re: TCP alive detection
това проверява дали в буфера на сокета има чакащи данни. очевидно не върши работа за случая.
Re: TCP alive detection
ами според гугле-то не е точно така. т.е. това проверява колко потенциално биха могли да дойдат, .... не съм опрял още до това и не съм го пробвал