求助:如何检测网线插拔

在程序中如何检测网线的插拔事件?网上搜了下,发现大都用类似下面的代码处理
int sockfd;
int i,len;
char buf[4096];
struct iovec iov;
struct msghdr msg;
struct sockaddr_nl sa;

memset(&sa,0,sizeof(sa));
sa.nl_family=AF_NETLINK;
sa.nl_groups=NETLINK_KOBJECT_UEVENT;
sa.nl_pid = 0;
memset(&msg,0,sizeof(msg));
iov.iov_base=(void *)buf;
iov.iov_len=sizeof(buf);
msg.msg_name=(void *)&sa;
msg.msg_namelen=sizeof(sa);
msg.msg_iov=&iov;
msg.msg_iovlen=1;

sockfd=socket(AF_NETLINK,SOCK_RAW,NETLINK_KOBJECT_UEVENT);
if(sockfd==-1)
    printf("socket creating failed:%s\n",strerror(errno));
if(bind(sockfd,(struct sockaddr *)&sa,sizeof(sa))==-1)
    printf("bind error:%s\n",strerror(errno));

len=recvmsg(sockfd,&msg,0);
if(len<0)
    printf("receive error\n");
else if(len<32||len>sizeof(buf))
    printf("invalid message");
for(i=0;i<len;i++)
    if(*(buf+i)=='\0')
        buf[i]='\n';
printf("received %d bytes\n%s\n",len,buf);

但我试过,在widora平台上还是无法检测到网线的插拔

请问还有其它方法么?

但那样只能通过轮询了,我想通过异步事件方式来通知,能做到么

mtk可以通过读取交换机芯片的寄存器来获取插拔状态。