Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171683
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 501
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-26 11:00
文章分类

全部博文(33)

文章存档

2014年(11)

2013年(22)

我的朋友

分类: LINUX

2013-11-12 16:23:25

1. 通过网络设备名获取网络设备id(if_index)

点击(此处)折叠或打开

  1. /*
  2.  *return val:
  3.  * -1 : fail
  4.  * others : interface index
  5.  */
  6. short get_ifindex_by_name(const char * name)
  7. {
  8.     struct ifreq ifr;
  9.     int sockfd = -1;
  10.     int err = -1;

  11.     if (!name){
  12.         return -1;
  13.     }

  14.     /*create socket*/
  15.     sockfd = socket(PF_INET, SOCK_DGRAM, 0);
  16.     if (sockfd <= 0){
  17.         return -1;
  18.     }

  19.     /*get if index by calling ioctl*/
  20.     strncpy(ifr.ifr_name, name, IFNAMSIZ);
  21.     err = ioctl(sockfd, SIOCGIFINDEX, (void *) &ifr);
  22.     if (err == -1){
  23.         return -1;
  24.     }

  25.     return ifr.ifr_ifindex;
  26. }

2. 通过网络设备名获取网络设备MAC地址

  1. char *get_mac(char * ifname, char * mac)
  2. {
  3.     struct ifreq ifreq;
  4.     unsigned char *p = NULL;
  5.     int sock = -1;
  6.     
  7.     if(ifname == NULL || mac == NULL){
  8.         printf("get mac character ERROR!");
  9.         return NULL;
  10.     }
  11.     
  12.     if((sock=socket(AF_INET,SOCK_STREAM,0))<0){
  13.      perror("socket");
  14.       return NULL;
  15.     }
  16.     
  17.     strcpy(ifreq.ifr_name,ifname);
  18.     if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0){
  19.         perror("ioctl");
  20.         close(sock);
  21.         return NULL;
  22.     }

  23.     p = (unsigned char *)(ifreq.ifr_hwaddr.sa_data);
  24.     sprintf(mac,"%02x:%02x:%02x:%02x:%02x:%02x",
  25.          p[0], p[1], p[2], p[3], p[4], p[5]);
  26.     
  27.     return mac;    
  28. }

3. 通过网络设备名获取网络设备ip地址:

  1. int get_dev_ip(const char *ifname, char *ip_addr, int len)
  2. {
  3.         struct ifreq ifr;
  4.         struct sockaddr_in *addr = NULL;
  5.         int sockfd = -1;

  6.         if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
  7.                 perror("socket");
  8.                 return -1;
  9.         }

  10.         memset(&ifr, 0, sizeof(struct ifreq));
  11.         addr = (struct sockaddr_in *)&ifr.ifr_addr;
  12.         addr->sin_family = AF_INET;
  13.         strcpy(ifr.ifr_name,ifname);

  14.         if (ioctl(sockfd, SIOCGIFADDR, &ifr) == 0) {
  15.                 snprintf(ip_addr, len, "%s", inet_ntoa(addr->sin_addr));
  16.                 close(sockfd);
  17.                 return 0;
  18.         }

  19.         close(sockfd);
  20.         return -1;
  21. }


阅读(1631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~