소켓을 네트워크 인터페이스에 바인딩
소켓을 특정 네트워크 인터페이스에 바인딩하려면 어떻게 해야 합니까?사용해 보았습니다.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
'programing' 카테고리의 다른 글
| SQLNonTransientConnection을 처리하는 방법예외? (0) | 2023.10.15 |
|---|---|
| 자바스크립트에서 변수가 null인지 빈 문자열인지 또는 모든 공백인지 확인하는 방법은? (0) | 2023.10.15 |
| SQL "올바른 달이 아님" (0) | 2023.10.15 |
| "cer"와 "stderr"이 무엇입니까? (0) | 2023.10.15 |
| 기류를 Oracle 데이터베이스에 연결하는 방법 (0) | 2023.10.15 |