2010-12-10 9 views
9

Ich habe mehrere Ethernet I/Fs. eth0, eth1, eth2 ... und ich möchte eine Verbindung zu einem externen Server herstellen, zB 1.2.3.4:80.vor dem Verbinden am Client-Code binden

Meine Verbindungen sind in Ordnung, aber unter bestimmten Umständen möchte ich als eth1 und nicht eth0 verbinden. Der Code des Servers überprüft die IP-Adresse meiner Schnittstelle. Ich denke, dass ich vor dem Verbinden binden muss. Ohne Bind (2) erhält der Server immer Pakete von eth0

Ich bin auf der Suche nach Code, der dieses Verhalten demonstriert. Hat jemand einen Link zu einem Beispiel?

Antwort

10

Sie benötigen dafür nicht bind(2).

Was Sie hier suchen, ist eine andere Netzwerkschnittstelle mit Ihrem Sockel zu verwenden. Um eine andere Netzwerkschnittstelle als die Systemstandardeinstellung zu verwenden, müssen Sie die Socketoption SO_BINDTODEVICE zusammen mit setsockopt verwenden. Die zu verwendende Schnittstelle, z. B. "eth1", sollte als Zeichenfolge im Feld ifr_name einer ifreq struct angegeben werden, die an setsockopt übergeben werden soll. Um dies zu tun, müssen Sie den Header <net/if.h> einfügen.

Grundsätzlich, so etwas wie die folgenden (ungetestet) Code:

int set_interface(int socket_fd, const char* interface_name) 
{ 
    ifreq interface; 
    memset(&interface, 0, sizeof(interface)); 
    strncpy(interface.ifr_name, interface_name, IFNAMSIZ); 
    int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof(ifreq)); 
    return res; 
} 

Also, stellen Sie sicher, dass Sie den Return-Code überprüfen, falls setsockopt ausfällt.

+1

Was ist der Unterschied zwischen Bind und SO_BINDTODEVICE? Warum bindet das Problem in meinem Fall nicht? – cateof

+3

@cateof, 'bind (2)' bindet einen Socket an einen bestimmten Endpunkt (IP-Adresse und Port). Es hat keine Ahnung von "Netzwerkschnittstellen". Um einen Socket mit einer bestimmten Netzwerkschnittstelle zu verbinden, müssen Sie spezielle Funktionen aus dem Header ' 'verwenden. –

Verwandte Themen