Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Sokety  (Přečteno 1678 krát)

Martin - ViPEr*CZ*

Sokety
« kdy: 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?
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Sokety
« Odpověď #1 kdy: 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.... ;)
« Poslední změna: 26 Prosince 2009, 16:08:03 od jfoot »
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Martin - ViPEr*CZ*

Re: Sokety
« Odpověď #2 kdy: 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é.
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

Firzen

  • Stálý člen
  • **
  • Příspěvků: 1287
    • Beroot
Re: Sokety
« Odpověď #3 kdy: 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.
« Poslední změna: 26 Prosince 2009, 21:12:14 od Firzen »
AMD Phenom II X6 1100T@3,3GHz, Gigabyte GeForce GT 430 1GiB, 8GiB RAM, 1TiB SATA3 HDD, Nokia N900
OS: Debian 6.0 Squeeze, Maemo 5
Citace
Prosintě ty jsi takový zkušený vývojář - co mám dělat, když nevím, jako něco udělat? :D

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Sokety
« Odpověď #4 kdy: 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.... ;) )

Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Martin - ViPEr*CZ*

Re: Sokety
« Odpověď #5 kdy: 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 ;-)
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

Martin - ViPEr*CZ*

Re: Sokety
« Odpověď #6 kdy: 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);
}
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Sokety
« Odpověď #7 kdy: 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... ;)
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

 

Provoz zaštiťuje spolek OpenAlt.