programing

소켓을 네트워크 인터페이스에 바인딩

elecom 2023. 10. 15. 16:59
반응형

소켓을 네트워크 인터페이스에 바인딩

소켓을 특정 네트워크 인터페이스에 바인딩하려면 어떻게 해야 합니까?사용해 보았습니다.setsockopt서버측에서, 그러나 클라이언트는 여전히 eth0 및 lo 인터페이스를 통해 서비스에 액세스할 수 있습니다.

이것은 특정 IP 주소를 설정함으로써 달성할 수 있습니다.serv_addr.sin_addr.s_addr.

하지만 제 생각에는 우리가 오직 우리가 사용해서 인터페이스에 바인딩할 수 있다고 생각합니다.setsockopt(IP 주소는 언급하지 않음).

설정을 통해 특정 인터페이스에 바인딩할 수 있습니다.SO_BINDTODEVICE소켓 옵션.

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0");
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
    ... error handling ...
}

경고:이 옵션을 사용하려면 루트 또는 기능이 있어야 합니다.

두 번째 방법은 getifaddrs()로 인터페이스에 연결된 IP 주소를 확인할 수 있습니다.

포괄적인 예는 후자의 링크를 따릅니다.

당신이 할 수 있는 유일한 방법은 당신이 언급한 것처럼-

특정 IP 주소를 설정함으로써serv_addr.sin_addr.s_addr

바인딩할 주소를 모르면 할 수 없습니다.

사용가능ioctl필요한 경우 현재 IP 주소를 결정하는 데 사용할 수 있습니다. 요즘은 좀 더 현명한 방법이 있겠지만, 저는 최근 현대식 리눅스 배포판에서 많은 일을 하지 않았습니다.

누군가가 유용하다고 생각할 수도 있기 때문에 저에게 도움이 된 솔루션을 공유합니다(Linux, C++).

uint32_t interfaceIndex = if_nametoindex(interfaceName);

여기서 "interfaceName"은 바인딩할 인터페이스의 이름입니다(: "eth0" 참조).이제 sin6_scope_id를 통해 소켓 주소 구조에서 이 인터페이스를 지정할 수 있습니다(IPv6를 사용하는 경우).

struct sockaddr_in6 socketAddress;
socketAddress.sin6_scope_id = interfaceIndex;

이제 평소와 같이 "바인드"를 통해 소켓을 인터페이스에 바인딩할 수 있습니다.

언급URL : https://stackoverflow.com/questions/14478167/bind-socket-to-network-interface

반응형