当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 【问题】Linux下如何用C语言获得网络信息,比如IP,掩码,mac地址,网关
帖子发表于 : 2007-07-10 17:38 

注册: 2007-06-21 11:00
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
在初学者那边也发了。。。这边也发下。。。希望有达人路过。。。

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

另外网关怎么获得呢?

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

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


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-07-10 23:10 
头像

注册: 2007-04-11 10:39
帖子: 319
送出感谢: 0 次
接收感谢: 0 次
~$ 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)
下载完毕,目前是“仅下载”模式


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-07-11 0:21 
头像

注册: 2007-06-02 14:56
帖子: 547
送出感谢: 0 次
接收感谢: 0 次
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;
};


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-07-11 9:41 

注册: 2007-06-21 11:00
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
恩,我之前用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连接,然后获取到的,貌似不如直接查配置?


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-07-11 11:37 
头像

注册: 2007-06-02 14:56
帖子: 547
送出感谢: 0 次
接收感谢: 0 次
gateway不属于网络接口配置,应该是路由的配置了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译