当前时区为 UTC + 8 小时



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

注册: 2007-06-21 11:00
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
前面那三个用ifconfig好像能查到,但是小弟我想在自己程序里用,所以请达人给指点下,或者给贴一下ifconfig的源码也行 :oops:

另外网关怎么获得呢?


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

注册: 2007-01-13 22:39
帖子: 202
地址: 杭州
送出感谢: 0 次
接收感谢: 0 次
这.... :oops: :oops:


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-07-10 17:08 

注册: 2007-06-21 11:00
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
有人说在什么etc\config还是什么地方有系统的配置信息可以查到?

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

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


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-07-10 17:39 

注册: 2007-06-21 11:00
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
下班了,顶一下。。。


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

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
代码:
#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多万


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

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
/proc下面没信息???要这样???


_________________
● 鸣学


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

注册: 2006-07-08 9:21
帖子: 1917
地址: University of Science and Technology Beijing
送出感谢: 1
接收感谢: 0 次
直接读取interface不一定能读出dhcp得到的信息吧


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-07-11 22:43 

注册: 2007-05-26 19:37
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
学习学习


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

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
翻了一下ifconfig和route的源代码

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

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


_________________
目前负债150多万


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

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
/etc/iftab 下面不有mac?

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


_________________
● 鸣学


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

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
/etc/iftab是Ubuntu特有的配置文件
如果要读各个发行版格式都不同的配置文件
在做格式解析时 会有更多的工作要作 不如一行ioctl来的方便了
何况不能预计一些发行版会用什么格式去存放 甚至存在不存在同类文件


_________________
目前负债150多万


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-07-12 15:44 

注册: 2007-06-21 11:00
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
啊,先谢过
虽然还是没太弄清楚。。。不过先去实践一下啦。

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


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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