C net-kapcsolat kerdes

Fórumok

C net-kapcsolat kerdes

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

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

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

Koszonom szepen a valaszokat, majd atragom magam rajtuk, csak most nagyon faradt vagyok...

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.

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

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!