Bill
Bill

Reputation: 1247

using a non-blocking socket connection in C

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?

Upvotes: 6

Views: 1880

Answers (2)

simonc
simonc

Reputation: 42165

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.

Upvotes: 4

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84159

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.

Upvotes: 6

Related Questions