Castecny zapis do socketu
Dalibor Straka
dast na panelnet.cz
Pátek Květen 2 16:34:26 CEST 2008
Ahoj,
On Fri, May 02, 2008 at 12:03:50AM +0200, Michal Dobes wrote:
> Jan Kasprzak napsal(a):
> > Cili zajima me, jak to ze kdyz mi poll()/epoll() rekne ze deskriptor
> > je pripraveny k zapisu, tak ve skutecnosti se zapis zablokuje? A co mam
> > delat pro to, aby se nezablokoval?
>
> Aby se nezablokoval, tak musí být deskriptor přepnut do neblokujícího
>
Neni pravda: (man poll)
POLLOUT Writing now will not block.
> režimu, jinak bude stát do doby, než zapíše celý udaný bafr.
>
write() pripadne vrati mensi pocet zapsanych byte nezli pozadovany.
> Dále (pokud aplikace nemá nárok na přenositelnost kamkoliv) bych si
> nastavil větší odesílací bafr (SO_SNDBUF) a i přímo nastavil, aby poll
> a spol hlásil, že deskriptor je připraven na zápis až v okamžiku, kdy
> tam bude místo na celou strukturu (SO_SNDLOWAT).
>
Ale pro uplnou jistotu je dobre pouzit O_NONBLOCK i kvuli nasledujicimu:
Under Linux, select() may report a socket file descriptor as "ready for
reading", while nevertheless a subsequent read blocks. This could for
example happen when data has arrived but upon examination has wrong
checksum and is discarded. There may be other circumstances in which a
file descriptor is spuriously reported as ready. Thus it may be safer
to use O_NONBLOCK on sockets that should not block.
-- Dalibor Straka
Další informace o konferenci Linux