tags:

views:

744

answers:

3

Currently I do the following to listen on any available port on all interfaces:

// hints struct for the getaddrinfo call
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

// Fill in addrinfo with getaddrinfo
if (getaddrinfo(NULL, "0", &hints, &res) != 0) {
 cerr << "Couldn't getaddrinfo." << endl;
 exit(-1);
}

I would like to dynamically bind to only one interface, the non-loopback interface of the system.

How would I go about doing this?

+4  A: 

Take a look at SO_BINDTODEVICE. Tuxology has a good description of this

Brian Agnew
A: 

If you want an excellent book on the matter:

UNIX Network Programming by W. Richard Stevens, in two volumes. Volume one covers sockets.

Also Advanced Programming in the UNIX Environment, also by Stevens and updated in 3rd edition by Rago.

These are widely considered to be classics and standard references for UNIX / Linux / et al

+1  A: 

You can use the SIOCGIFADDR ioctl() to determine the IP address of a specific interface, and then bind() to that address.

Beano
This is most common solution, though it breaks down if you have multiple interfaces with the same address or your interfaces change addresses.
ephemient