LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3877|回复: 10

请教怎样获得本机默认网关和DSN?

[复制链接]
发表于 2005-4-27 13:30:46 | 显示全部楼层 |阅读模式
我希望通过程序获取本机的一些网络状况,包括IP,子网掩码,广播地址 主机名 和
DNS,网关,以及网络的带宽,发送流量,接收流量,以及网络连接状态(已经连上/断开)。
前面几个(IP,子网掩码,广播地址 主机名)我已经得到了,但后面几个不知道怎么做,请高手帮忙,不胜感激!
发表于 2005-4-27 14:55:44 | 显示全部楼层
/etc/resolv.conf
回复 支持 反对

使用道具 举报

发表于 2005-4-27 15:07:17 | 显示全部楼层
网关就查看路由表吧
/proc/net/route
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-27 15:08:45 | 显示全部楼层
谢谢Tetris!我在你说的哪个文件里看到了“默认网关”的地址。但我不知道这个文件是否是实时更新的呢?比如说我通过命令修改了默认网关,那儿的地址会变吗?
我更想通过访问内核数据结构的方法得到这些值,不知道怎么做。
下面给出我得到IP等的程序,希望哪位能告诉我剩下的该怎么做?
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <net/route.h>

#define ETH_NAME "eth0"
#define MAXHOSTNAMELEN 100

int main()
{
        printf("Content-Type:text/plain\n\n");
        printf("<TITLE>主机IP</TITLE>");
        printf("<H3>主机网络状况查询结果:</H3>");

        int sock;
        struct sockaddr_in sin;
        struct ifreq ifr;
        struct hostent *host;
        char **alias;
        char hostname[MAXHOSTNAMELEN];  /* hostname */       

       
        sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock == -1)
        {
                perror("socket");
                return -1;
        }
       
       
        strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);
        ifr.ifr_name[IFNAMSIZ - 1] = 0;

        /////////////////////////////////////////////// get IP
       
        if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
        {
                perror("ioctl");
                return -1;
        }
       
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        printf("your IP address is:%s<br>\n", inet_ntoa(sin.sin_addr));
        ///////////////////////////////////////////////// get netmask
        if (ioctl(sock, SIOCGIFNETMASK, &ifr) < 0)
        {
                perror("ioctl");
                return -1;
        }
       
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        printf("your netmask is:%s<br>\n", inet_ntoa(sin.sin_addr));
        /////////////////////////////////////////////////  get broadcast address
                if (ioctl(sock, SIOCGIFBRDADDR, &ifr) < 0)
        {
                perror("ioctl");
                return -1;
        }
       
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        printf("your broadcast address is:%s<br>\n", inet_ntoa(sin.sin_addr));
        ///////////////////////////////////////////////// get hostname
        gethostname(hostname,MAXHOSTNAMELEN );
        printf("your hostname is:%s<BR>",hostname);
        ////////////////////////////////////////////////
       
        return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-27 15:15:11 | 显示全部楼层
我在《unix网络编程卷》里看到过用路由套接口获得网关的方法,但在linux里,我没找到书中所说的rt_msghdr结构,所以搞不定。剩下的那些东西google搜了一天连一点头绪也没有,请好心人帮帮忙啊!
回复 支持 反对

使用道具 举报

发表于 2005-4-27 15:18:37 | 显示全部楼层
你的程序没有问题,但只能得到IPv4的地址,如果要在IPv6下获得IP地址还是一样要读proc文件系统。
/proc里的文件是内核与程序的一种通信方式,从中可以读取到很多内核的状态。如果你编过驱动程序就会知道文件的内容是在read调用时产生的。所以,从中读取到的路由表信息一定是最新的。
回复 支持 反对

使用道具 举报

发表于 2005-4-27 15:21:50 | 显示全部楼层
Post by haohao_h
我在《unix网络编程卷》里看到过用路由套接口获得网关的方法,但在linux里,我没找到书中所说的rt_msghdr结构,所以搞不定。剩下的那些东西google搜了一天连一点头绪也没有,请好心人帮帮忙啊!


rt_msghdr早就没人用了吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-27 15:41:36 | 显示全部楼层
在proc文件系统里
IP,子网掩码,广播地址 主机名 和
DNS,网关,以及网络的带宽,发送流量,接收流量,以及网络连接状态(已经连上?断开?)
这些状态都有吗?
那我如果想去设这些值怎么办?调用ifconfig函数?这样做是不是太外围了!
回复 支持 反对

使用道具 举报

发表于 2005-4-27 15:53:42 | 显示全部楼层
ifconfig很多东西就是从/proc里读出来的。
IP,子网掩码,广播地址 主机名从IPv6开始都是从/proc里读。
DNS是应用层的东西,与内核无关。
网关只能从/proc里去读。
网络的带宽是硬件的东西了,除非有驱动的支持否则应该不可能吧?
发送流量,接收流量,可以自己抓包计算。
网络连接状态(已经连上?断开?)永远无法准确得到。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-27 16:11:27 | 显示全部楼层
谢谢!谢谢!让我在感到山穷水尽的时候看到了一丝希望吧!至少我可以知道往哪个方向努力了。
不知道可不可以交你这个朋友,以后有一些问题可以讨教你!我的msn是:haohao_h@hotmail.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表