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

C、C++和Java语言
回复
早7点
帖子: 41
注册时间: 2007-06-21 11:00
送出感谢: 0
接收感谢: 0
联系:

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

#1

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

在初学者那边也发了。。。这边也发下。。。希望有达人路过。。。

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

另外网关怎么获得呢?

----------------------------------------------------------------------------------------------------------

有人说在什么etc\config还是什么地方有系统的配置信息可以查到?
头像
kinzess
帖子: 319
注册时间: 2007-04-11 10:39
送出感谢: 0
接收感谢: 0

#2

帖子 kinzess » 2007-07-10 23:10

~$ dpkg -S `whereis ifconfig`
dpkg:没有找到 *ifconfig:*。
net-tools: /sbin/ifconfig
net-tools: /usr/share/man/man8/ifconfig.8.gz

~$ sudo apt-get source -d net-tools
Password:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
读取状态信息... 完成
需要下载 307kB 的源代码包。
获取:1 http://tw.archive.ubuntu.com feisty/main net-tools 1.60-17ubuntu1 (dsc) [581B]
获取:2 http://tw.archive.ubuntu.com feisty/main net-tools 1.60-17ubuntu1 (tar) [265kB]
获取:3 http://tw.archive.ubuntu.com feisty/main net-tools 1.60-17ubuntu1 (diff) [41.2kB]
下载 307kB,耗时 32s (9510B/s)
下载完毕,目前是“仅下载”模式
头像
ofewiofewo
帖子: 547
注册时间: 2007-06-02 14:56
送出感谢: 0
接收感谢: 0

#3

帖子 ofewiofewo » 2007-07-11 0:21

kernel-*/include/linux/if.h的ifreq 结构应该有你要的信息,ifconfig.c的printif(char *ifname, int ifaliases)部分代码也许有参考价值。good lucky

代码: 全选

struct ifreq 
{
#define IFHWADDRLEN	6
	union
	{
		char	ifrn_name[IFNAMSIZ];		/* if name, e.g. "en0" */
	} ifr_ifrn;
	
	union {
		struct	sockaddr ifru_addr;
		struct	sockaddr ifru_dstaddr;
		struct	sockaddr ifru_broadaddr;
		struct	sockaddr ifru_netmask;
		struct  sockaddr ifru_hwaddr;
		short	ifru_flags;
		int	ifru_ivalue;
		int	ifru_mtu;
		struct  ifmap ifru_map;
		char	ifru_slave[IFNAMSIZ];	/* Just fits the size */
		char	ifru_newname[IFNAMSIZ];
		void __user *	ifru_data;
		struct	if_settings ifru_settings;
	} ifr_ifru;
};
早7点
帖子: 41
注册时间: 2007-06-21 11:00
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 早7点 » 2007-07-11 9:41

恩,我之前用ifreq可以查到ip,掩码了

代码: 全选

      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 (ioctl(sock, SIOCGIFADDR, &ifr) < 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 (ioctl(sock, SIOCGIFNETMASK, &ifr) < 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 );
mac用这种方法似乎也能查到,但是网关好像不能。
而且据说这种方法是要先建立一个socket连接,然后获取到的,貌似不如直接查配置?
头像
ofewiofewo
帖子: 547
注册时间: 2007-06-02 14:56
送出感谢: 0
接收感谢: 0

#5

帖子 ofewiofewo » 2007-07-11 11:37

gateway不属于网络接口配置,应该是路由的配置了。
回复

回到 “C/C++/Java”