Hozzászólások
ha megnezed a man recv-t es a man send-et, akkor latni fogod, hogy a recv nem fog visszaadni ilyesmi errort kapcsolatbontas eseten. A send viszont igen, ECONNRESET, ha jol emlekszem.
Amugy az ilyesmit meg lehet oldani periodikus ping szeru uzenetekkel...
esetleg meg kell nezni a setsockopt SO_KEEPALIVE dolgot
- A hozzászóláshoz be kell jelentkezni
[quote:8645f95031="micsa"]Amugy az ilyesmit meg lehet oldani periodikus ping szeru uzenetekkel...
esetleg meg kell nezni a setsockopt SO_KEEPALIVE dolgot
Az SO_KEEPALIVE alapértelmezés szerint (ha jól tudom) két óra csend után kezd probe-okat küldözgetni. Linux kernelen a különféle jellemzőket piszkálhatod: man 7 tcp, /tcp_keepalive (figyelj a conntrack-os megjegyzésre), /TCP_KEEP.
Az SO_KEEPALIVE hordozható (mint socket option), a linux alatt piszkálható beállítások nem (sem a /proc alatti tcp_keepalive*, sem a programban a TCP_KEEP... opciók).
Megnéztem a SUSv1-ben (ha már hordozhatóságról beszélünk, legyen minél régebbi :)), és úgy értelmezem, hogy az SO_KEEPALIVE szükség esetén felébreszt egy SIGPIPE-pal (vagy EPIPE-pal, ha az előbbit ignorálod/blokkolod) a socket-re írásból (amibe én beleértem a select()-nek a writefds-ét is).
Van még a SUSv1-ben az XTI API-nál TCP_KEEPALIVE, de nem hiszem, hogy ezt sokan használnák (úgy értem, az XTI-t). Említi az RFC 1122-t.
Szerintem megbízhatóbb eredményt nyújt, ha az alkalmazásprotokollba kerül valami NOP vagy PING. Hordozható, az alkalmazás kezében van az időzítés, a NAT nem zavarja (életben is tartható vele a NAT). Legalábbis lényegesen kevesebb doksit kell hozzá elolvasni. Különféle tunnel-eknek jót tehet (HTTP?) Esetleg ki lehet vezetni felhasználói felületre (pl. "kapcsolat ellenőrzése" gomb).
- A hozzászóláshoz be kell jelentkezni
Ha poll-ozol, akkor ott lekérdezhető a kapcsolat státusa cliens oldalon is.
Én ezt szoktam használni.
Ajánlom figyelmedbe: ftp://public@meditor.hu , c_examples alatt:
Mediag.tar.gz, amely egy komplett hálózati tranzakciós program,
hasznos példákkal.
Üdv: meditor
Ja! jelszó az nincs, nyomj egy O.K.-t vagy egy entert
- A hozzászóláshoz be kell jelentkezni
Koszonom szepen a valaszokat, majd atragom magam rajtuk, csak most nagyon faradt vagyok...
- A hozzászóláshoz be kell jelentkezni
Hello!
Olyat mar tudok C-ben, hogy kapcsolodok egy szerverhez, es szepen beszelgetek vele.
A gond ott kezdodik, hogy ha valamilyen kulso ok miatt szakad a netem, akkor azt nem tudom sehogyan se lekezelni.
[code:1:465a4c9424]
while (1) {
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);}
/*uzenet lekezelese, bla bla*/
}
[/code:1:465a4c9424]
Ezt a progit konkretan IRC-hez hasznalom, es nekem eleg, ha csak akkor csinalok valamit, ha kapok is uzenetet, de ha pl szakad az ADSL, akkor nem tudok mit csinalni. Tehat valakinek van valami otlete erre?
A valaszokat elore is koszonom!
UI: tudom, hogy ez a vegtelen ciklus nem megoldas, azt at is akarom irni, de a problemaval meg mindig nem tudok mit kezdeni.
- A hozzászóláshoz be kell jelentkezni
[quote:98245ee347="cemaq"]... de ha pl szakad az ADSL, akkor nem tudok mit csinalni.
és a
perror("recv");
exit(1);
Neked semmi? ;)
ps:lehet h félreértettem...
- A hozzászóláshoz be kell jelentkezni
Sajna az nem muxik, ugyanis NAT mogul megy a progi, es ha szakad az ADSL, arrol senki nem tud semmit, csak az osszes kapcsolat timeoutos lesz...
Szal ez a gondom, de azert kosz!
- A hozzászóláshoz be kell jelentkezni
man select()
- A hozzászóláshoz be kell jelentkezni