Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Martin - ViPEr*CZ* 24 Prosince 2009, 15:23:00

Název: Sokety
Přispěvatel: Martin - ViPEr*CZ* 24 Prosince 2009, 15:23:00
Mám příklad jednoduchého serveru v C/C++ za použití soketů (bind, listen apod.). Server mi funguje, připojím se i telnetem, po připojení můžu komunikovat podle odeslaných požadavků (čtu read a odezvu odesílám write). Když program killnu... killall jméno_daemona, tak se ukončí.... když ho ale chci spustit znovu nějakou dobu to nejde... prostě bind se nechce "nabindovat" na určitý port. Přitom na něm určitě nic nenaslouchá již.... Nevíte proč se tak děje?
Název: Re: Sokety
Přispěvatel: jfoot 25 Prosince 2009, 18:00:21
Zdravím Vás,

na podobný problém jsem narazil při zápasu s jednou aplikací....

Jev by mohl pocházet z úrovně TCP/IP : dva procesy uzavírají
spojení zasláním FIN packetů potvrzených ACK na úrovni kernelu. Do hry pak může vstoupit konstanta TIME_WAIT (prakticky vstupuje když jeden z procesů ukončí svůj běh nestandardně= např. pád na ústa, kill, atp.) po kterou, de facto kernel "drží" daný port a nedovolí se k němu připojit (čeká se na ACK). Absolutní hodnota konstanty TIME_WAIT je údajně ovlivnitelná (či neovlivnitelná) v rámci daného OS. Pro Ubuntu (Debian) je to podle :
Citace
http://www.stolk.org/debian/timewait.html

Citace
For linux, it is hard-coded to 60 seconds in the kernel in include/net/tcp.h as:
#define TCP_TIMEWAIT_LEN (60*HZ)

Zdali je to pravda či ne, jsem nedokázal, bohužel, se svými znalostmi kernelu posoudit....

Ještě pár linků pro inspiraci :
Citace
http://hea-www.harvard.edu/~fine/Tech/addrinuse.html
http://manpages.ubuntu.com/manpages/jaunty/en/man7/tcp.7.html
http://www.developerweb.net/forum/showthread.php?t=2941

P.S. Přeji pěkné, nepracovní Vánoce.... ;)
Název: Re: Sokety
Přispěvatel: Martin - ViPEr*CZ* 25 Prosince 2009, 19:24:49
Uff díky vůbec za odpověď... nečekal jsem že někdo vůbec na takovouto záležitost odpoví.
Mrknu na to ... samozřejmě až po svátkách a zkusím si stáhnout zdrojáky pro apache třeba a prozkoumat to jak to řeší oni. Popřípadě využiji pro svoji aplikaci jejich kód. Chtěl bych aby to umělo i nějaké šifrované přenosy dat pro ochranu informací než se pustím do nějakého online systému.

Vám také šťastné a veselé.
Název: Re: Sokety
Přispěvatel: Firzen 26 Prosince 2009, 20:24:08
Zdravím Vás,

na podobný problém jsem narazil při zápasu s jednou aplikací....

Jev by mohl pocházet z úrovně TCP/IP : dva procesy uzavírají
spojení zasláním FIN packetů potvrzených ACK na úrovni kernelu. Do hry pak může vstoupit konstanta TIME_WAIT (prakticky vstupuje když jeden z procesů ukončí svůj běh nestandardně= např. pád na ústa, kill, atp.) po kterou, de facto kernel "drží" daný port a nedovolí se k němu připojit (čeká se na ACK). Absolutní hodnota konstanty TIME_WAIT je údajně ovlivnitelná (či neovlivnitelná) v rámci daného OS. Pro Ubuntu (Debian) je to podle :
Citace
http://www.stolk.org/debian/timewait.html

Citace
For linux, it is hard-coded to 60 seconds in the kernel in include/net/tcp.h as:
#define TCP_TIMEWAIT_LEN (60*HZ)
Je to pravda, koukal jsem se do toho souboru a je to tam.
Zdali je to pravda či ne, jsem nedokázal, bohužel, se svými znalostmi kernelu posoudit....

Ještě pár linků pro inspiraci :
Citace
http://hea-www.harvard.edu/~fine/Tech/addrinuse.html
http://manpages.ubuntu.com/manpages/jaunty/en/man7/tcp.7.html
http://www.developerweb.net/forum/showthread.php?t=2941

P.S. Přeji pěkné, nepracovní Vánoce.... ;)
Jo, je to tam, koukal jsem se do toho souboru. Je to hned na začátku.
Název: Re: Sokety
Přispěvatel: jfoot 27 Prosince 2009, 11:46:04
Zdravím kolegy,

Jo, je to tam, koukal jsem se do toho souboru. Je to hned na začátku.

OK, dík, Fizenovi, čili, čistě teoreticky (možná i prakticky) by Martin - ViPEr*CZ* mohl lokálně (na stroji s daným OS) změnit hodnotu konstanty TIME_WAIT ve zdrojáku kernelu, kernel překompilovat a otestovat na tomto novém kernelu, zdali je onen socketový problém skutečně spojen s konstantou TIME_WAIT.... ( k čemuž jej rozhodně neponoukám.... ;) )

Název: Re: Sokety
Přispěvatel: Martin - ViPEr*CZ* 28 Prosince 2009, 13:04:19
He he... no řeší se to kapičku jináč... až zapnu notebook, tak to sem postnu... Včéra jsem to asi 4 hodiny hledal ve zdrojákách apache a na netu.
Navíc jsem se naučil i s threadama a už mi server šlape pěkně i pro x klientů najednou. Zatím to jen posílá IP adresu :-D Chci ještě zapojit SSL do přenosu ;-)
Název: Re: Sokety
Přispěvatel: Martin - ViPEr*CZ* 28 Prosince 2009, 17:02:34
PS:

vyřešil jsem to takto:

Kód: [Vybrat]
struct linger li;
li.l_onoff = true;
li.l_linger = 0;
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) == -1)
{
                cout << "Neúspěch setsockopt()" << endl;
close(fd);
}
Název: Re: Sokety
Přispěvatel: jfoot 28 Prosince 2009, 21:58:24
Zdravím Martin - ViPEr*CZ* ,

PS:

vyřešil jsem to takto:

Kód: [Vybrat]
struct linger li;
li.l_onoff = true;
li.l_linger = 0;
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) == -1)
{
                cout << "Neúspěch setsockopt()" << endl;
close(fd);
}

OK, dík za info.


...Navíc jsem se naučil i s threadama a už mi server šlape pěkně i pro x klientů najednou. Zatím to jen posílá IP adresu :-D Chci ještě zapojit SSL do přenosu ;-)

Hodně úspěchů do další práce... ;)