2013-01-16 1 views
0

Netlink 소켓을 사용하여 프로그램을 작성했습니다. 링크 상태 변경 (예 : 네트워크 케이블이 연결/분리되었을 때)을 성공적으로 감지 할 수 있습니다. 그러나 두 경우 모두 RTM_NEWLINK 이벤트가 발생합니다.netlink에서 링크 상태가 변경된 인터페이스 알기

내가 SIOCGIFFLAGS을 쿼리하고 IFF_UP 상태를 getifaddrs 시스템 호출을 사용하여 상태를 알 수 있다고 생각했습니다. 그렇게하려면 링크 이벤트를 유발 한 인터페이스가 무엇인지 알고 싶습니다. 그걸 알 수있는 방법이 있을까요? 현재 링크 변경을 야기한 인터페이스를 제공하는 구조체 nlmsghdr 또는 sockaddr_nl의 멤버를 알지 못합니다.

답변

0

SIOCIFCONF ioctl 호출을 사용하면 사용 가능한 모든 인터페이스를 반복 할 수 있습니다. 그리고 SIOCGIFFLAGS와 IFF_UP 및 IFF_RUNNING을 사용하여 해당 인터페이스의 상태를 확인할 수 있습니다. 그러나 SIOCGIFCONF는 브리징을 수행하고 해당 브리지에 하나 또는 두 개의 인터페이스를 추가 할 경우 많은 도움이되지 않습니다.

요즘 나는 netlink도 다루고 있습니다. 내 문제는 "링크 상태 변경을 유발 한 인터페이스 알기"와 거의 비슷합니다. 내가 만든 링크를 참조하십시오 : https://superuser.com/questions/596296/how-to-identify-that-one-of-the-bridge-interfacessw-bridge-in-linux-is-down

netlink 소켓 코드를 게시 해주십시오.

0

방금 ​​ifi_index에서 이름을 얻을 수 있습니다 :

시간이 nlmsghdr 구조입니다
struct ifinfomsg *ifi = NLMSG_DATA(h); 
char name[IF_NAMESIZE]; 
printf("%s is %s\n", if_indextoname(ifi->ifi_index, name), ifi->ifi_flags & IFF_UP ? "up":"down"); 

.

분명히 전문가는 아니지만 케이블을 연결하거나 분리 할 때 RTM_NEWLINK를 얻는 것이 재밌다는 것을 알았습니다. 나는 케이블이 연결 얻을 때 RTM_DELLINK을 기대 ... 아니면 내가 놓친 거지 뭔가 것 ...

가 그래, 난 당신이 단순히 ifi-> ifi_flags보고 상태를 얻을 수 있습니다 :) 뭔가를 누락되었습니다. 필요에 따라 IFF_UP, IFF_RUNNING 및 IFF_LOWER_UP에 관심을 가질 것으로 생각됩니다.

관련 문제