socket close észlelése

Fórumok

Hello

Van egy kis telnet proxy szerüségem. A kliens beküld egy parancsot és utána rögtön kapja a választ. Az egészet select() -el oldottam meg.
Ez a része működik is, viszont a válasz lekérése után a kliens zárja a kapcsolatát. Nem küld semmi lezáró üzenetet.

A kérdés az lehet-e valahogy detektálni, hogy az a socket már nem él és a szerver is le tudja zárni?

Hozzászólások

elvileg SIGPIPE signal kene jojjon (broken pipe).

A'rpi

nem, ilyet csak akkor kapnál, ha a túloldal annyira bezárta a kapcsolatot, hogy nem hajlandó már fogadni se, te meg próbálsz írni. persze erre is fel kell készülni.

egy "rendes" socket kliens - ha már nem akar többet kommunikálni - csak a küldés oldalt zárja le (man shutdown), és továbbra is várja a szervertől jövő dolgokat. a szerver egy EOF formájában érzékeli, hogy a kliens nem akar többet küldeni neki (a read visszatér, és az olvasott byte-ok száma 0), erre a "rendes" szerver befejezi a teendőit, kiírja, amit még ki szeretne a kliens felé (ő pedig azt fogadja), majd a szerver is lezárja a küldő oldalt (ekkor a szerver választhat, hogy rögtön close, vagy előbb shutdown, aztán close - mindegy), a kliens szintén megkapja az EOF-ot, és mivel tudja, hogy ő már bezárta a küldő irányt, ezért egy close művelettel véget vet a saját socketjének.

Emlékeim szerint a lezárt socket (a select szerint) olvasható, és 0 hosszú input-ot ad. [ 0 == read(...) ]

socket() helyett epoll v. kqueue. Valamint a recv()/recvfrom() == 0 && errno == 0 indikalja a kapcsolat lezartat. Ha utana kapsz valami adatot azon a socketen, akkor az mar nem az a socket amit megnyitottal. Siman elcseszted ott, h az a socket fd-t ujra letrehozta a kernel egy masik bejovo kapcsolathoz amig nem figyeltel oda.

---
pontscho / fresh!mindworkz