求助:如何检测网线插拔



  • 在程序中如何检测网线的插拔事件?网上搜了下,发现大都用类似下面的代码处理
    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可以通过读取交换机芯片的寄存器来获取插拔状态。



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