[问题]Linux下如何用C语言获得网络信息,比如IP,掩码,mac地址,网关

为当前最终发行版之前的所有版本提供支持
回复
早7点
帖子: 41
注册时间: 2007-06-21 11:00
送出感谢: 0
接收感谢: 0
联系:

[问题]Linux下如何用C语言获得网络信息,比如IP,掩码,mac地址,网关

#1

帖子 早7点 » 2007-07-10 17:01

前面那三个用ifconfig好像能查到,但是小弟我想在自己程序里用,所以请达人给指点下,或者给贴一下ifconfig的源码也行 :oops:

另外网关怎么获得呢?
zhangyujin78
帖子: 202
注册时间: 2007-01-13 22:39
来自: 杭州
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 zhangyujin78 » 2007-07-10 17:05

这.... :oops: :oops:
早7点
帖子: 41
注册时间: 2007-06-21 11:00
送出感谢: 0
接收感谢: 0
联系:

#3

帖子 早7点 » 2007-07-10 17:08

有人说在什么etc\config还是什么地方有系统的配置信息可以查到?

有知道的达人路过么。。。

我机器上没安Ubuntu,通过telnet上别人机器,所以不方便查看那些文件。。。
早7点
帖子: 41
注册时间: 2007-06-21 11:00
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 早7点 » 2007-07-10 17:39

下班了,顶一下。。。
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

#5

帖子 xhy » 2007-07-11 20:55

代码: 全选

#include <stdio.h>
#include <stdlib.h>

int main( )
{

    FILE* netinfo = popen("/sbin/ifconfig", "r");
       
    if(!netinfo){
        puts("error while open pipe");
        exit(1);
    } 

    char str[200];
       
    while( fgets(str, 199, netinfo) != NULL ){
        printf("%s", str);
    } 
       
    pclose(netinfo);

}
目前负债150多万
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#6

帖子 eexpress » 2007-07-11 20:56

/proc下面没信息???要这样???
● 鸣学
头像
drivel
帖子: 1917
注册时间: 2006-07-08 9:21
来自: University of Science and Technology Beijing
送出感谢: 1 次
接收感谢: 0
联系:

#7

帖子 drivel » 2007-07-11 21:01

直接读取interface不一定能读出dhcp得到的信息吧
regal888
帖子: 22
注册时间: 2007-05-26 19:37
送出感谢: 0
接收感谢: 0

#8

帖子 regal888 » 2007-07-11 22:43

学习学习
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

#9

帖子 xhy » 2007-07-12 2:28

翻了一下ifconfig和route的源代码

获取MAC地址和IP分两大步
1 读取/proc/net/dev文件 获得网络设备的名字
2 根据名字调用ioctl系列函数获得MAC, IP, MTU, METRIC等信息

获取路由则比较方便
直接读取/proc/net/route就可以了
目前负债150多万
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#10

帖子 eexpress » 2007-07-12 9:00

/etc/iftab 下面不有mac?

lin的思维,应该都是直接读文件就是。
● 鸣学
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

#11

帖子 xhy » 2007-07-12 9:23

/etc/iftab是Ubuntu特有的配置文件
如果要读各个发行版格式都不同的配置文件
在做格式解析时 会有更多的工作要作 不如一行ioctl来的方便了
何况不能预计一些发行版会用什么格式去存放 甚至存在不存在同类文件
目前负债150多万
早7点
帖子: 41
注册时间: 2007-06-21 11:00
送出感谢: 0
接收感谢: 0
联系:

#12

帖子 早7点 » 2007-07-12 15:44

啊,先谢过
虽然还是没太弄清楚。。。不过先去实践一下啦。

xhy9楼说的是不是类似这种:

代码: 全选

   int sock;
   struct sockaddr_in sin;
   struct ifreq ifr;
   
   sock = socket(AF_INET, SOCK_DGRAM, 0);
   if (sock == -1)
   {
      perror("socket");
      return -1;      
   }
   
   strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
   ifr.ifr_name[IFNAMSIZ - 1] = 0;
   
   if ([color=red]ioctl(sock, SIOCGIFADDR, &ifr)[/color] < 0)
   {
      perror("ioctl");
      return -1;
   }
   memcpy(&sin, &ifr.ifr_addr, sizeof(sin));   
   
   ip[0] = (char)(sin.sin_addr.s_addr >> 0  );
   ip[1] = (char)(sin.sin_addr.s_addr >> 8  );
   ip[2] = (char)(sin.sin_addr.s_addr >> 16 );
   ip[3] = (char)(sin.sin_addr.s_addr >> 24 );   
   
   if [color=red](ioctl(sock, SIOCGIFNETMASK, &ifr)[/color] < 0)
   {
      perror("ioctl");
      return -1;
   }
   memcpy(&sin, &ifr.ifr_addr, sizeof(sin));      
   
   mask[0] = (char)(sin.sin_addr.s_addr >> 0  );
   mask[1] = (char)(sin.sin_addr.s_addr >> 8  );
   mask[2] = (char)(sin.sin_addr.s_addr >> 16 );
   mask[3] = (char)(sin.sin_addr.s_addr >> 24 );

ioctl(sock, SIOCGIFADDR, &ifr)
ioctl(sock, SIOCGIFNETMASK, &ifr)
分别是ip和掩码
mac地址的不知道用哪个
回复

回到 “老旧版本支持”