Previous Next Table of Contents

6. Advanced Socket Programming

6.1 How would I put my socket in non-blocking mode?

From Andrew Gierth ( andrew@erlenstar.demon.co.uk):

Technically, fcntl(soc, F_SETFL, O_NONBLOCK) is incorrect since it clobbers all other file flags. Generally one gets away with it since the other flags (O_APPEND for example) don't really apply much to sockets. In a similarly rough vein, you would use fcntl(soc, F_SETFL, 0) to go back to blocking mode.

To do it right, use F_GETFL to get the current flags, set or clear the O_NONBLOCK flag, then use F_SETFL to set the flags.

And yes, the flag can be changed either way at will.

6.2 How can I put a timeout on connect()?

Andrew Gierth ( andrew@erlenstar.demon.co.uk) has outlined the following procedure for using select() with connect(), which will allow you to put a timeout on the connect() call:

First, create the socket and put it into non-blocking mode, then call connect(). There are three possibilities:

If the connection succeeds:

If the connection fails:

Sample code that illustrates this can be found in the socket-faq examples, in the file connect.c.


Previous Next Table of Contents