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

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
早7点
帖子: 41
注册时间: 2007-06-21 11:00

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

#1

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

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

另外网关怎么获得呢?
zhangyujin78
帖子: 202
注册时间: 2007-01-13 22:39
来自: 杭州

#2

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

这.... :oops: :oops:
早7点
帖子: 41
注册时间: 2007-06-21 11:00

#3

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

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

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

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

#4

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

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

#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
来自: 长沙

#6

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

/proc下面没信息???要这样???
● 鸣学
头像
drivel
帖子: 1918
注册时间: 2006-07-08 9:21
来自: University of Science and Technology Beijing
联系:

#7

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

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

#8

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

学习学习
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星

#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
来自: 长沙

#10

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

/etc/iftab 下面不有mac?

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

#11

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

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

#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地址的不知道用哪个
回复