Portál AbcLinuxu, 13. května 2025 19:27

Dotaz: Zavření non-block socketu během navazování připojení.

Jardík avatar 25.10.2013 01:15 Jardík | skóre: 40 | blog: jarda_bloguje
Zavření non-block socketu během navazování připojení.
Přečteno: 286×
Odpovědět | Admin
Mám socket, vytvořený v non-block režimu a na něj zavolám connect(). Ten mi vrátí -1 a errno EINPROGRESS, což znamená, že spojení nemohlo být navázáno okamžitě a bude navázáno později.
EINPROGRESS
The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).
Jde mi o to, jestli je během této doby bezpečné socket zavřít zavoláním close() a jestli bude zavřen buď okamžitě, popř. hned poté, co by bylo navázáno spojení nebo při tom došlo k chybě.
Věřím v jednoho Boha.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.10.2013 10:37 lofcek
Rozbalit Rozbalit vše Re: Zavření non-block socketu během navazování připojení.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hm .. a co na tom by mohlo byt nebezpecne, pripadne pre koho? Ci myslis, ze ked to urobit vybuchne Temelin?

Z pohladu tvojho procesu je spojenie ukoncene okamzite. A druhej strane (ak uz nahodou doslo k nadviazaniu) posle kernel notifikaciu (rovnako ako close pri kazdom nadviazanom spojeni). A ked k nadviazaniu nedoslo, tak vlastne nie je koho notifikovat.
Josef Kufner avatar 25.10.2013 12:15 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zavření non-block socketu během navazování připojení.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je důležité si uvědomit, že TCP garantuje doručení všech dat pouze, pokud bylo spojení korektně uzavřeno. To tedy znamená, že si na aplikační úrovni musíš buď posílat potvrzení (dlouho otevřená spojení) nebo detekovat předčasný konec dat (HTTP-like komunikace).

TCP ti zaručí, že data přijdou ve správném pořadí, takže stačí poslat vždy jen potvrzení té poslední přijaté zprávy a tím potvrdíš i vše předtím. Toto potvrzování je docela rozumné spojit i s potvrzením zpracování přijatých dat, pokud to zpracování je rychlé. Pro dlouhodobější požadavky pak budeš potvrzovat zahájení zpracování, či zařazení do fronty.

Spousta protokolů tohle nedělá a pak dochází ke ztrácení či poškozování dat. Například HTTP nekontroluje konec, Jabber ztrácí zprávy v rozpadlých spojeních (XEP 0184 není nedílnou součástí protokolu) a podobně.

Jakmile budeš mít takovéto jednoduché potvrzování, nemusíš řešit, jak dobře jsi spojení uzavřel a celá tato otázka téměř pozbývá smyslu.
Hello world ! Segmentation fault (core dumped)
Řešení 1× (Jardík (tazatel))
28.10.2013 14:35 luky
Rozbalit Rozbalit vše Re: Zavření non-block socketu během navazování připojení.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jde mi o to, jestli je během této doby bezpečné socket zavřít zavoláním close() a jestli bude zavřen buď okamžitě, popř. hned poté, co by bylo navázáno spojení nebo při tom došlo k chybě.
Jo, sitova vrstva ma svoji referenci a fyzicky se socket uvolni az navaze spojeni.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.