免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2821 | 回复: 5
打印 上一主题 下一主题

Linux系统下程序如何获得系统所有网卡的信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-06 17:46 |只看该作者 |倒序浏览
问题如标题所示:

在Linux系统里,程序使用socket编程,如何获得系统所有网卡的信息:如IP,MAC或别名(eth0/eth1)等。

非常感谢

论坛徽章:
0
2 [报告]
发表于 2009-01-06 18:51 |只看该作者
unp chapter18 Routing Sockets好像有涉及这方面的内容
建议楼主去看一下

论坛徽章:
0
3 [报告]
发表于 2009-01-06 20:23 |只看该作者
这里的netlink是一个获取NIC列表的例子,内核代码获取的。。。
http://bbs.chinaunix.net/viewthr ... page%3D1#pid9328873
另外,网上有一堆用socket代码实现这个的
不过我还是建议楼主看看net-tools中的ifconfig的源代码

[ 本帖最后由 duanjigang 于 2009-1-6 20:25 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-01-06 20:44 |只看该作者
找来了一个代码,你自己改改吧,适用OS:linux, freebsd, solaris.
int GetMacIP(char MAC[], char IP[])
{
 register int fd, intrface, retn = 0;
   register int up, ip, mac;
   struct ifreq buf[MAX_NET_CARDS];
   struct arpreq arp;
   struct ifconf ifc;
    if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0)
   {
      ifc.ifc_len = sizeof buf;
      ifc.ifc_buf = (caddr_t) buf;
      if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc))
         {
           intrface = ifc.ifc_len / sizeof (struct ifreq);
           while (intrface-- > 0)
           {

                up = mac = ip = 0;
                 //Judge whether the net card status is up

               if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface])))
               {
                 if (buf[intrface].ifr_flags & IFF_PROMISC)
                 {
                  // puts ("the interface is PROMISC");

                 }
               }
           if (buf[intrface].ifr_flags & IFF_UP)
                   {
                             up = 1;
                   }
               //Get IP of the net card

               if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))
                   {
                      //get ip address

                       memset(IP, 0, 20);
                       sprintf(IP, "%s",
                       (char*)inet_ntoa(((struct sockaddr_in*)
                       (&buf[intrface].ifr_addr))->sin_addr));
                    // printf("IP %s\n",IP);

                       ip = 1;
                   }
              #ifdef __sun__
                  arp.arp_pa.sa_family = AF_INET;
                  arp.arp_ha.sa_family = AF_INET;
               ((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=
             ((struct sockaddr_in*)(&buf[intrface].ifr_addr))
              ->sin_addr.s_addr;
               if (!(ioctl (fd, SIOCGARP, (char *) &arp)))
                   {
                        mac = 1;
                        //Get HW address

                        memset(MAC, '\0', 20);
                   sprintf(MAC ,"%02x:%02x:%02x:%02x:%02x:%02x\n",
                      (unsigned char)arp.arp_ha.sa_data[0],
                      (unsigned char)arp.arp_ha.sa_data[1],
                      (unsigned char)arp.arp_ha.sa_data[2],
                      (unsigned char)arp.arp_ha.sa_data[3],
                      (unsigned char)arp.arp_ha.sa_data[4],
                      (unsigned char)arp.arp_ha.sa_data[5]);
                   }
               #else
         #if 0
              //Get HW ADDRESS of the net card

              if (!(ioctl (fd,  SIOCGENADDR, (char *) &buf[intrface])))
                  {
                   mac = 1;
                   memset(MAC, '\0', 20);
                   sprintf(MAC, "%02x:%02x:%02x:%02x:%02x:%02x\n",
                   (unsigned char)buf[intrface].ifr_enaddr[0],
                   (unsigned char)buf[intrface].ifr_enaddr[1],
                   (unsigned char)buf[intrface].ifr_enaddr[2],
                   (unsigned char)buf[intrface].ifr_enaddr[3],
                   (unsigned char)buf[intrface].ifr_enaddr[4],
                   (unsigned char)buf[intrface].ifr_enaddr[5]);
                   }
              #endif
          if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))
                 {
                    mac = 1;
                    memset(MAC, 0, 20);
                 sprintf(MAC, "%02x:%02x:%02x:%02x:%02x:%02x\n",
                   (unsigned char)buf[intrface].ifr_hwaddr.sa_data[0],
                   (unsigned char)buf[intrface].ifr_hwaddr.sa_data[1],
                   (unsigned char)buf[intrface].ifr_hwaddr.sa_data[2],
                   (unsigned char)buf[intrface].ifr_hwaddr.sa_data[3],
                   (unsigned char)buf[intrface].ifr_hwaddr.sa_data[4],
                   (unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]);
                  // printf("MAC %s\n", MAC);

                 }
          #endif
          if(ip  && mac  && up )
                  {
                          close(fd);
                          return 1;
                  }
                  }//end of while()

      } //end of ioctl()

   } //end of if socket

       close (fd);
       return 0;
}

论坛徽章:
0
5 [报告]
发表于 2009-01-06 22:51 |只看该作者
使用ioctl系统调用。
或者看一下ifconfig的源代码

论坛徽章:
0
6 [报告]
发表于 2009-01-08 15:53 |只看该作者
谢谢各位,问题解决了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP