zoukankan      html  css  js  c++  java
  • netlink

    #include <sys/socket.h>
    #include <linux/types.h>
    #include <linux/netlink.h>
    #include <linux/rtnetlink.h>
    
    int main(void)
    {
            int nl_socket;
            if((nl_socket = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_ROUTE)) == -1)
                    exit(1);
    
            struct sockaddr_nl addr;
            memset(&addr,0,sizeof(addr));
            addr.nl_family = PF_NETLINK;
            addr.nl_groups = RTMGRP_IPV4_IFADDR;
            addr.nl_pid=0;
    
            if(bind(nl_socket,(struct sockaddr *)&addr,sizeof(addr)) == -1)
            {       
                    close(nl_socket);
                    exit(1);
            }
    
    
    
            return 0;
    }  

    http://blog.csdn.net/luckyapple1028/article/details/50839395

    http://blog.csdn.net/luckyapple1028/article/details/50936563

    https://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <sys/select.h>
    #include <sys/time.h> 
    
    #include <linux/types.h>
    #include <linux/netlink.h>
    #include <linux/rtnetlink.h>
    #include <linux/if.h>
    #include <linux/if_ether.h>
    
    #define MAX_MSG_SIZE    1024
    
    void handle_newaddr(void)
    {
    	system("/usrsbin/mDNSResponder -f /var/rendezvous.conf -v 2");
    }
      
    void receive_netlink_message(int sock)
    {
        int ret,length;
        fd_set nl_rset;
        struct nlmsghdr *nl;
        struct timeval read_timeout = {10, 0};
        struct iovec iov;  // 使用 iovec 进行接收
        struct msghdr msg = {NULL, 0, &iov, 1, NULL, 0, 0}; // 初始化 msghdr
         
        nl = NULL;
        if ((nl = (struct nlmsghdr *) malloc(MAX_MSG_SIZE)) == NULL )
             return;
              
        iov.iov_base = (void *)nl;             // 封装 nlmsghdr
        iov.iov_len = MAX_MSG_SIZE;  // 指定长度
         
        FD_ZERO(&nl_rset); 
        FD_SET(sock, &nl_rset);
         
        while(1)
        {
            ret=select(sock+1,&nl_rset,NULL, NULL,&read_timeout);
            printf("===============ret=%d===============
    ",ret); 
    	
            if(ret == -1)  
                continue; 
            else if (ret == 0)  
                continue;
    	else
    	{
    	    length = recvmsg(sock,&msg,0);
    
    	    if(length <= 0)
                {
    		free(nl);
    		break;
    	    }
    	    switch(nl->nlmsg_type)
    	    {
    		case RTM_NEWADDR:
    			handle_newaddr();
    			break;
    		default:
    			printf("Unknown netlink message type : %d", nl->nlmsg_type);
    	   }
            }
        }
        return ;
    }
     
    int main(void)
    {
        int nl_socket;
        struct sockaddr_nl addr;
         
        if((nl_socket = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_ROUTE)) == -1)
            exit(1);
         
        memset(&addr,0,sizeof(addr));
        addr.nl_family = PF_NETLINK;
        addr.nl_groups = RTMGRP_IPV4_IFADDR;
        addr.nl_pid=0;
      
        if(bind(nl_socket,(struct sockaddr *)&addr,sizeof(addr)) == -1)
        {     
            close(nl_socket);
            exit(1);
        }
        while(1)
        {
    	printf("111111111111111111111111111
    ");
    	receive_netlink_message(nl_socket);
        }
        return 0;
    }
    

    https://www.cnblogs.com/oracleloyal/p/5333276.html

    https://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/

    http://blog.csdn.net/hansel/article/details/38088645

    http://blog.csdn.net/gt945/article/details/45315911

    网线热插拔

    #include <sys/types.h>    
    #include <sys/socket.h>    
    #include <asm/types.h>    
    #include <linux/netlink.h>    
    #include <linux/rtnetlink.h>    
    #include <unistd.h>  
    #include <stdlib.h>    
    #include <stdio.h>    
    #include <sys/ioctl.h>    
    #include <linux/if.h>    
    #include <string.h>    
        
    #define BUFLEN 20480    
        
    int main(int argc, char *argv[])    
    {    
        int fd, retval;    
        char buf[BUFLEN] = {0};    
        int len = BUFLEN;    
        struct sockaddr_nl addr;    
        struct nlmsghdr *nh;    
        struct ifinfomsg *ifinfo;    
        struct rtattr *attr;    
        
        fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);    
        setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len));    
        memset(&addr, 0, sizeof(addr));    
        addr.nl_family = AF_NETLINK;    
        addr.nl_groups = RTNLGRP_LINK;    
        bind(fd, (struct sockaddr*)&addr, sizeof(addr));    
        while ((retval = read(fd, buf, BUFLEN)) > 0)    
        {    
            for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, retval); nh = NLMSG_NEXT(nh, retval))    
            {    
                if (nh->nlmsg_type == NLMSG_DONE)    
                    break;    
                else if (nh->nlmsg_type == NLMSG_ERROR)    
                    return -1;    
                else if (nh->nlmsg_type != RTM_NEWLINK)    
                    continue;    
                ifinfo = NLMSG_DATA(nh);    
                printf("%u: %s", ifinfo->ifi_index,    
                        (ifinfo->ifi_flags & IFF_LOWER_UP) ? "up" : "down" );    
                attr = (struct rtattr*)(((char*)nh) + NLMSG_SPACE(sizeof(*ifinfo)));    
                len = nh->nlmsg_len - NLMSG_SPACE(sizeof(*ifinfo));    
                for (; RTA_OK(attr, len); attr = RTA_NEXT(attr, len))    
                {    
                    if (attr->rta_type == IFLA_IFNAME)    
                    {    
                        printf(" %s", (char*)RTA_DATA(attr));    
                        break;    
                    }    
                }    
                printf("
    ");    
            }    
        }    
        
        return 0;    
    }

    http://blog.csdn.net/qq123386926/article/details/50695725

  • 相关阅读:
    成为高级 React 开发你需要知道的知识点
    Socket 连接问题之大量 TIME_WAIT
    x == (x = y) 不等于 (x = y) == x ?
    「工具」三分钟了解一款思维导图工具:XMind Zen
    Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
    vim中delete(backspace)键不能向左删除
    Vue2.0学习(四)--组件的继承与扩展
    quasar+cordova+zbar实现Android扫描条形码
    PWA技术理论+实战全解析
    分页请求时,有新数据加入时,下一页会出现重复数据问题
  • 原文地址:https://www.cnblogs.com/Malphite/p/8325859.html
Copyright © 2011-2022 走看看