Non-blocking sockets
It is occasionally convenient to make use of sockets
that do not block; that is,
I/O
requests that
cannot complete immediately and
would therefore cause the process to be suspended awaiting completion are
not executed, and an error code is returned.
Once a socket has been created via
the
socket
call, it may be marked as non-blocking
by
fcntl(S)
as follows:
#include <fcntl.h>
#include <sys/file.h>
...
int s;
...
s = socket(AF_INET, SOCK_STREAM, 0);
...
if (fcntl(s, F_SETFL, O_NDELAY) < 0) {
perror("fcntl F_SETFL, O_NDELAY");
exit(1);
}
...
When performing non-blocking
I/O
on sockets, one must be
careful to check for the error
EWOULDBLOCK
(stored in the
global variable
errno),
which occurs when
an operation would normally block, but the socket it
was performed on is marked as non-blocking.
In particular,
accept,
connect,
send,
recv,
read
and
write
can
all return
EWOULDBLOCK,
and processes should be prepared
to deal with such return codes.
If an operation such as a
send
cannot be done in its entirety,
but partial writes are sensible (for example, when using a stream socket),
the data that can be sent immediately will be processed,
and the return value will show the amount actually sent.
© 2005 The SCO Group, Inc. All rights reserved.
SCO OpenServer Release 6.0.0 -- 02 June 2005