Portál AbcLinuxu, 14. července 2025 05:01


Dotaz: Select - multiplexování socketů

19.8.2010 20:39 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Select - multiplexování socketů
Přečteno: 257×
Odpovědět | Admin
Přílohy:
Zdravím, pokouším se napsat program komunikující přes lokální sockety (AF_UNIX), který má přijmout spojení, vytvořit nový socket pro to dané spojení (s ním pak něco dělat) a čekat na další.

Problém nastává, když chci aby hlídal dva sockety najednou (řídící - vypnutí,restart; socket pro „obyčejné“ spojení) pomocí funkce select(). Když se jsou sockety zařazeny za sebou
listen(...,...);
listen(...,...);
tak všechno funguje v pořadí daném filedescriptory.

Když zkusím použít select() takhle:
FD_ZERO(&fd_read);
FD_SET(sockfd, &fd_read);	
FD_SET(rootsockfd, &fd_read);	
	
select(2,&fd_read, NULL, NULL, NULL);
if (FD_ISSET(sockfd,&fd_read)) {
	printf("Normal socket ready.\n");
}
else {
	printf("Root socket ready.\n");
}
nic se nestane a „server“ se zasekne a už se nedostane k accept(). Zajímavé ovšem je, že „klient“ odešle to co má a skončí.

Otázka zní: Jak funguje select()? Vycházel jsem z referenční příručky GNU C library (http://www.gnu.org/software/libc/manual/), kde mají ukázky podobným stylem.

(Zdrojáky v příloze)
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!

Ř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

Řešení 1× (Martin Matějek (tazatel))
19.8.2010 21:36 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Select - multiplexování socketů
Odpovědět | | Sbalit | Link | Blokovat | Admin

První argument select(2) není počet deskriptorů v poli deskriptorů, ale číslo nejvyššího deskriptoru navýšené o 1.

Prakticky ve vašem programu čekáte na čtecí událost nad prázdnou množinou deskriptorů, která tedy nikdy nenastane. Deskriptor 0 a 1 má totiž již standardní vstup a standardní výstup.

19.8.2010 23:51 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Rozbalit Rozbalit vše Re: Select - multiplexování socketů
Aha!
select(FD_SETSIZE,&fd_read, NULL, NULL, NULL);
to vyřešilo, díky!
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!
20.8.2010 07:43 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Select - multiplexování socketů
Což ovšem kvůli implementaci v jádře bude nechutně pomalé. Proč tam asi tak ten první argument vůnec je? Je třeba při přidávání deskriptoru do pole hledat nejvyšší hodnotu deskriptoru a tu pak selectu předat.
Luboš Doležel (Doli) avatar 20.8.2010 13:50 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Select - multiplexování socketů
Proč tam asi tak ten první argument vůnec je?
To by mě mimochodem docela zajímalo.
20.8.2010 16:00 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Select - multiplexování socketů

To byla řečnická otázka. Ale jestli chcete odpověď:

Právě proto, že pole deskriptorů jsou skutečná pole a jádro je prochází lineárně. Vzhledem k tomu, že deskriptory mají obvykle malé číslo, tak je hloupost procházet všech INT_MAX prvků, když z nich většina je nevyplněná.

20.8.2010 16:44 Martin Matějek | skóre: 12 | blog: Flying_circus | Kladno
Rozbalit Rozbalit vše Re: Select - multiplexování socketů
Mea culpa. Poté co jsem odeslal odpověď mě napadlo, že to možná je kanón na vrabce. Dík za vysvětlení.
Don't judge me by the friends I keep. No, no, no. Judge me by the enemies I have slain!
21.8.2010 01:23 zulu
Rozbalit Rozbalit vše Re: Select - multiplexování socketů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kromě toho už vyřešeného prvního parametru... ten if-else po selectu by měl být if,if.

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.