2009-07-13 11 views
3

Derzeit kann ich folgendes auf jedem verfügbaren Port auf allen Schnittstellen zu hören:Wie binde ich einen Socket dynamisch an nur eine Netzwerkschnittstelle?

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

Ich möchte dynamisch nur eine Schnittstelle binden, die nicht-Loopback-Schnittstelle des Systems.

Wie würde ich das machen?

Antwort

4

Werfen Sie einen Blick auf SO_BINDTODEVICE. Tuxology hat eine good description dieser

+0

Website ist unten, zwischengespeicherte Kopie hier: http://web.archive.org/web/20090812134009/http://tuxology.net/tag/interface –

1

Wenn Sie ein ausgezeichnetes Buch über die Angelegenheit wollen:

UNIX Network Programming von W. Richard Stevens, in zwei Bänden. Band eins umfasst Steckdosen.

Auch Advanced Programmierung in der UNIX-Umgebung, auch von Stevens und in der 3. Auflage von Rago aktualisiert.

Diese sind weit verbreitet zu sein Klassiker und Standardreferenzen für UNIX/Linux/et al

1

Sie können die SIOCGIFADDR verwenden ioctl() um zu bestimmen, die IP-Adresse einer bestimmten Schnittstelle, und dann bind() an diese Adresse betrachtet.

+0

Dies ist die häufigste Lösung, obwohl es zusammenbricht, wenn Sie haben Mehrere Schnittstellen mit derselben Adresse oder Ihre Schnittstellen ändern Adressen. – ephemient

Verwandte Themen