2009-07-13 6 views
3

Actuellement je fais ce qui suit pour écouter sur un port disponible sur toutes les interfaces:Comment lier dynamiquement une socket à une seule interface réseau?

// 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); 
} 

Je voudrais lier dynamiquement à une seule interface, l'interface non-réalimentation du système.

Comment dois-je prendre?

Répondre

4

Jetez un coup d'œil à SO_BINDTODEVICE. Tuxology a une good description de cette

+0

Le site est en panne, copie cachée ici: http://web.archive.org/web/20090812134009/http://tuxology.net/tag/interface –

1

Si vous voulez un excellent livre sur la question:

réseau UNIX Programmation par W. Richard Stevens, en deux volumes. Le premier volume couvre les prises.

Programmation avancée dans l'environnement UNIX, également par Stevens et mise à jour en 3ème édition par Rago.

Ceux-ci sont largement considérés comme des classiques et des références standard pour UNIX/Linux/et al

1

Vous pouvez utiliser le SIOCGIFADDR ioctl() pour déterminer l'adresse IP d'une interface spécifique, puis bind() à cette adresse.

+0

Ceci est la solution la plus courante, même si elle tombe en panne si vous avez plusieurs interfaces avec la même adresse ou vos interfaces changent d'adresse. – ephemient

Questions connexes