2010-12-10 2 views
9

여러 개의 이더넷 I/F가 있습니다. eth0, eth1, eth2 ... 그리고 외부 서버 (예 : 1.2.3.4:80)에 연결하고 싶습니다.클라이언트 코드에 연결하기 전에 바인드

내 연결은 정상이지만 일부 특수한 상황에서는 eth0가 아닌 eth1로 연결하려고합니다. 서버의 코드가 내 인터페이스의 IP 주소를 확인합니다. 연결하기 전에 바인드해야한다고 생각합니다. bind (2)가 없으면 서버는 항상 eth0에서 패킷을 가져옵니다.

이 동작을 나타내는 코드를 찾고 있습니다. 아무도 예제에 링크되어 있습니까?

답변

10

이 경우 bind(2)이 필요하지 않습니다.

당신이 여기서하려는 것은 다른 네트워크 인터페이스을 소켓과 함께 사용하는 것입니다. 시스템 기본값 이외의 네트워크 인터페이스를 사용하려면 SO_BINDTODEVICE 소켓 옵션을 setsockopt과 함께 사용해야합니다. 예를 들어, "eth1"과 같이 사용하려는 인터페이스는 필드의 ifreq struct 인 문자열로 지정해야하며 setsockopt으로 전달되어야합니다. 이렇게하려면 <net/if.h> 헤더를 포함해야합니다.

기본적으로, 다음 (안된) 코드 같은 :

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

, 당신은 setsockopt이 실패 할 경우, 반환 코드를 확인해야합니다.

+1

바인딩과 SO_BINDTODEVICE의 차이점은 무엇입니까? 왜 바인드가 내 문제를 해결하지 못하는 걸까요? – cateof

+3

@cateof,'bind (2)'는 소켓을 특정 끝점 (IP 주소와 포트)에 바인딩합니다. "네트워크 인터페이스"에 대한 개념이 없습니다. 특정 네트워크 인터페이스와 소켓을 연결하려면''헤더의 특수 기능을 사용해야합니다. –

관련 문제