6
votes

I'm changing a socket connection in a script to a non-blocking connection. In a tutorial I found the lines:

x=fcntl(s,F_GETFL,0);              // Get socket flags
fcntl(s,F_SETFL,x | O_NONBLOCK);   // Add non-blocking flag

So I added them after I create my socket and before the connect statement. And it's no longer blocking :) but it also doesn't connect. I'm not getting any errors, the connect is just returning -1. If I comment these lines out it connects.

What else do I need to add to get a non-blocking connection to connect?

2

2 Answers

6
votes

Check return value of connect(2) - you should be getting -1, and EINPROGRESS in errno(3). Then add socket file descriptor to a poll set, and wait on it with select(2) or poll(2).

This way you can have multiple connection attempts going on at the same time (that's how e.g. browsers do it) and be able to have tighter timeouts.

4
votes

connect will probably immediately return a EINPROGRESS error. Read up on use of select.

Note that you'll probably want to wrap your call to select in the TEMP_FAILURE_RETRY macro.