Portál AbcLinuxu, 9. května 2025 03:03

Dotaz: TCP server na linuxu

27.3.2013 15:36 Petr
TCP server na linuxu
Přečteno: 563×
Odpovědět | Admin
Dobrý den, v C++ jsem si napsal jednoduchý server (na linuxu). Vycházel jsem z informací popsaných zde: Hlavně z toho příkladu.

Přenos dat mezi serverem a klientem (taky napsaný v c++) funguje bez problémů. Ale při testování jsem narazil na zajímavou chybu. Zapnu server a připojím se na něj pomocí klienta, klient pošle data, server je zpracuje a pošle odpověď. Potom server ukončím a když se ho pokusím znovu rychle zapnou, vypíše mi chybu při pojmenování socketu, tedy funkce bind. Stačí počkat pár vteřin a další pokus zapnutí serveru se již podaří.

Je to normální chování, nebo by měl server naskočit hned?

Řešení dotazu:


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

Odpovědi

27.3.2013 15:45 chrono
Rozbalit Rozbalit vše Re: TCP server na linuxu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pravdepodobne záleží na tom, akým spôsobom sa ten server ukončí (a teda, či pri ukončovaní pozatvára spojenia...).
27.3.2013 15:49 Petr
Rozbalit Rozbalit vše Re: TCP server na linuxu
Kontroloval jsem a zavírání otevřeného socketu (close(socket)) by mělo být v pořádku.
27.3.2013 15:54 Petr
Rozbalit Rozbalit vše Re: TCP server na linuxu
Jak správně by se měl vůbec server ukončit?

Já jenom pozavírám otevřené sockety pomocí close(nazev_socketu) a ukončím program. Nezapomínám na něco?
Michy avatar 27.3.2013 16:04 Michy | skóre: 11 | Praha
Rozbalit Rozbalit vše Re: TCP server na linuxu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Před voláním bind je třeba soketu nastavit příznak SO_REUSEADDR. Tedy něco takového:
static const int flag = true;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
Více viz man 7 socket
27.3.2013 17:14 Petr
Rozbalit Rozbalit vše Re: TCP server na linuxu
Děkuju, pomohl to. Mohl bych poprosit o stručné vysvětlení, co funkce setsockopt přesně provedla. A proč to bez ní šel server spustit znovu až po několika vteřinách? Děkuji.
27.3.2013 17:41 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: TCP server na linuxu
Zkuste se podívat programem netstat na tabulku spojení. Obvykle tam i po ukončení spojení ještě spojení zůstane se stavem "TIME_WAIT" nějakou dobu, než timer vyprší. Očekával bych, že existence buď přímo těchto ještě zcela nesmazaných spojení nebo jiného podobného timeru klasifikuje soket jako obsazený i nějakou dobu po ukončení programu. Funkce setsockopt nastavuje volby soketu a konkrétně nastaví jeho reentrantnost.
Řešení 1× (little.owl)
27.3.2013 21:18 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: TCP server na linuxu
Kdybyste chtěl poměrně rozvláčné vysvětlení, tak dobře poslouží TIME_WAIT and its design implications for protocols and scalable client server systems. (To podstatné začíná větou „There are two reasons for the TIME_WAIT state.“, praktický význam pak odstavcem „The second reason for the TIME_WAIT state is to implement TCP's full-duplex connection termination reliably.“)
28.3.2013 20:11 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: TCP server na linuxu
Díky za hezký odkaz.
little.owl avatar 11.4.2013 00:13 little.owl | skóre: 22 | blog: Messy_Nest | Brighton/Praha
Rozbalit Rozbalit vše Re: TCP server na linuxu
+1
A former Red Hat freeloader.

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.