Portál AbcLinuxu, 8. května 2025 22:39
write()
hlásí, že komunikace proběhla v pořádku. Jak se dá na odesílající straně detekovat, že nastala chyba a data k příjemci nedorazila? Zkoušel jsem si hrát s nastavením socketu SO_KEEPALIVE, což funguje, ale přijde mi to jako obcházení problému a ne jeho řešení...
U SO_KEEPALIVE mas problem v tom ten timeout je globalni na urovni celeho OS, a neni mozne nastavit ho pro jedno konkretni spojeni.Ale lze: TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL
write()
skončí úspěšně po předání dat kernelu a ne až potom, co druhá strana data opravdu přijme.
SO_KEEPALIVE jde nastavit pro každý socket zvlášť, ale toto řešení přidává dodatečnou síťovou komunikaci, což v mém případě bohužel nemohu použít.
Ono toho garantuje daleko méně než si mnoho lidí myslí, například Jabber takle ztrácí zprávy, když ti vypadne spojení (je to chyba v návrhu XMPP).A nejde to ani dobře řešit přes TCP acky... ale naštěstí XMPP má definované jak aplikační acky, tak pingy, dělal to původně před pár lety Justin Karneges a byly kolem toho velké diskuze, kdy různí lidi vymýšlely totální cypoviny jako end-to-end potvrzování. Takže je to jen na lenosti implementátorů.
Pokud chceš mít jistotu, že nějaká zpráva byla doručena, pošli si ACK na aplikační úrovni a nespoléhej na TCP.Souhlas. Na druhou stranu TCP samo zajistuje potvrzovani doruceni dat, takze teoreticky by mohlo jit rozsirit API tak, aby toto potvrzeni bylo propagovano do aplikace.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.