分页: 1 / 1

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

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

另外网关怎么获得呢?

发表于 : 2007-07-10 17:05
zhangyujin78
这.... :oops: :oops:

发表于 : 2007-07-10 17:08
早7点
有人说在什么etc\config还是什么地方有系统的配置信息可以查到?

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

我机器上没安Ubuntu,通过telnet上别人机器,所以不方便查看那些文件。。。

发表于 : 2007-07-10 17:39
早7点
下班了,顶一下。。。

发表于 : 2007-07-11 20:55
xhy

代码: 全选

#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);

}

发表于 : 2007-07-11 20:56
eexpress
/proc下面没信息???要这样???

发表于 : 2007-07-11 21:01
drivel
直接读取interface不一定能读出dhcp得到的信息吧

发表于 : 2007-07-11 22:43
regal888
学习学习

发表于 : 2007-07-12 2:28
xhy
翻了一下ifconfig和route的源代码

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

获取路由则比较方便
直接读取/proc/net/route就可以了

发表于 : 2007-07-12 9:00
eexpress
/etc/iftab 下面不有mac?

lin的思维,应该都是直接读文件就是。

发表于 : 2007-07-12 9:23
xhy
/etc/iftab是Ubuntu特有的配置文件
如果要读各个发行版格式都不同的配置文件
在做格式解析时 会有更多的工作要作 不如一行ioctl来的方便了
何况不能预计一些发行版会用什么格式去存放 甚至存在不存在同类文件

发表于 : 2007-07-12 15:44
早7点
啊,先谢过
虽然还是没太弄清楚。。。不过先去实践一下啦。

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