Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231033
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 296
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-22 11:52
文章分类

全部博文(31)

文章存档

2018年(3)

2017年(11)

2016年(12)

2015年(5)

我的朋友

分类: C/C++

2017-09-19 15:56:48

    对于网卡信息的获取,总是有各种各样的方式的,之前总结了用ioctl 和 netlink的方式,但是这两种方式都是通过网卡名称来获取网卡的其他的信息的,要是只知道ip地址,要获取网卡名称,这样的需求,就只能通过遍历的方式来进行了,用ioctl 通过命令字SIOCGIFCONF是可以获取系统所有的up的网卡的信息的,但是这种方式有一个缺点就是要预先分配接着这些网卡信息的空间,具体请参考http://blog.chinaunix.net/uid-30226910-id-5766831.html。查了一下,发现有可以不用预分配空间的方式,用struct ifaddrs,这个数据结构在ifaddrs.h 中,如下

点击(此处)折叠或打开

  1. struct ifaddrs
  2. {
  3.   struct ifaddrs *ifa_next;  
  4.   char *ifa_name;
  5.   unsigned int ifa_flags;

  6.   struct sockaddr *ifa_addr;
  7.   struct sockaddr *ifa_netmask;
  8.   union
  9.   {
  10.     struct sockaddr *ifu_broadaddr; 
  11.     struct sockaddr *ifu_dstaddr;
  12.   } ifa_ifu;

  13. # ifndef ifa_broadaddr
  14. # define ifa_broadaddr ifa_ifu.ifu_broadaddr
  15. # endif
  16. # ifndef ifa_dstaddr
  17. # define ifa_dstaddr ifa_ifu.ifu_dstaddr
  18. # endif

  19.   void *ifa_data; /* Address-specific data (may be unused). */
  20. };
struct ifaddrs这个数据结构记录了ip地址相关的内容,包括掩码,广播地址,点对点的对端地址
头文件ifaddrs.h 还提供了两个接口来获取和释放整个ifaddrs 链的接口:
extern int getifaddrs (struct ifaddrs **__ifap) __THROW;
extern void freeifaddrs (struct ifaddrs *__ifa)  __THROW;

例子:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <ifaddrs.h>
  3. #include <arpa/inet.h>
  4. #include <net/if.h>
  5. #include <linux/socket.h>
  6. #include <string.h>
  7.     
  8. char * getifname_by_addr(struct in_addr *addr,char ifname[])
  9. {
  10.      struct sockaddr_in *sin;
  11.       struct ifaddrs *ifa = NULL, *if_list;
  12.   
  13.      if (getifaddrs(&if_list) < 0)
  14.      {
  15.          return NULL;
  16.      }
  17.  
  18.      for (ifa = if_list; ifa != NULL; ifa = ifa->ifa_next)
  19.      {
  20.          if(ifa->ifa_addr->sa_family == AF_INET)
  21.          {
  22.                 if(!memcmp(addr,&(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr),sizeof(*addr))){
  23.                         memcpy(ifname,ifa->ifa_name,sizeof(ifa->ifa_name));
  24.                         freeifaddrs(if_list);
  25.                         return ifname;
  26.                 }
  27.  
  28.  
  29.          }
  30.      }
  31.  
  32.      freeifaddrs(if_list);
  33.      return NULL;
  34.  }
  35.    
  36.  int main(void)
  37.  {
  38.      struct in_addr addr;
  39.      char ifname[IFNAMSIZ]={0};
  40.      if(inet_aton("192.168.13.3",&addr)==0)
  41.                 return -1;

  42.      if(getifname_by_addr(&addr,ifname)!=NULL)
  43.              printf("%s \n",ifname);

  44.      return 0;
  45.  }

这个例子可以通过ip地址获取ip地址对应的网卡的名称




阅读(7232) | 评论(0) | 转发(0) |
0

上一篇:linux pthread_cond_wait/signal

下一篇:gdb命令

给主人留下些什么吧!~~