2010-12-10 17 views
9

Tengo múltiples I/F de ethernet. eth0, eth1, eth2 ... y quiero conectarme a un servidor externo, por ej., 1.2.3.4:80.vincular antes de conectar en el código de cliente

Mis conexiones están bien, pero en algunas circunstancias especiales quiero conectarme como eth1 y no como eth0. el código del servidor verifica la dirección IP de mi interfaz. Creo que necesito unirme antes de conectarme. Sin vinculación (2) el servidor siempre obtiene paquetes de eth0

Estoy buscando un código que demuestre este comportamiento. ¿Alguien tiene un enlace a un ejemplo?

Respuesta

10

No necesita bind(2) para esto.

Lo que estás buscando hacer aquí es utilizar una interfaz de red diferente con tu zócalo. Para usar una interfaz de red que no sea la predeterminada del sistema, debe usar la opción de socket SO_BINDTODEVICE junto con setsockopt. La interfaz que desea utilizar, como "eth1", por ejemplo, debe especificarse como una cadena en el campo ifr_name de ifreq struct que se pasará al setsockopt. Para hacer esto, debe incluir el encabezado <net/if.h>.

Básicamente, algo así como el siguiente código (no probado):

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

También, asegúrese de comprobar el código de retorno, en caso de falla setsockopt.

+1

¿cuál es la diferencia entre bind y SO_BINDTODEVICE? ¿Por qué obligar no resuelve el problema en mi caso? – cateof

+3

@cateof, 'bind (2)' vincula un socket a un punto final particular (dirección IP y puerto). No tiene noción de "interfaces de red". Para asociar un zócalo con una determinada interfaz de red, debe utilizar recursos especiales del encabezado ''. –

Cuestiones relacionadas