LinuxSir.cn,穿越时空的Linuxsir!

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

用C语言检测是否联接到Internet: 研究net-tools(ifconfig)后的收获和问题

[复制链接]
发表于 2004-7-27 23:37:58 | 显示全部楼层 |阅读模式
我前几天考虑用C语言检测是否联接到Internet(adsl拨号 以及 调制接调器拨号).
" 比如说, 我打算自己写一个计时程序来控制上网的时间, 我计划在脚本中调用adsl-start之后, 立即调用这个程序. 我当然不希望在没有拨号而又单独调用这个程序时它仍会计时, 所以我觉得需要有一种办法在程序中检测是否已经拨号到了Internet.  "

有几位仁兄给过一些建议, 很感谢, 但似乎不的要领. 我今天研究了一下net-tools包的ifconfig源代码, 其大体的流程是这样的:

main () :     
    if_print((char *)NULL) ;
    if_print((ifr.ifr_name)  ;
if_print(char *ifname):         
    if(!ifname)  for_all_interface(do_if_print, &opt_a);
    // 当用/sbin/ifconfig -a命令时设置opt_a = 1;
    else
        struct interface *ife;
         ife = lookup_interface(ifname);
         res = do_if_fetch(ife);
         if(res >= 0) ife_print(ife);
          ...
// 也就是说, 不指明接口名就把所有的可用接口都检测, 如果指明ppp0或eth0这样的接口就只检测这一接口.

然后在lib/interface.h中有struct interface 的声明, 在lib/interface.c中有如下调用关系:
for_all_interface() -- for(有关接口的链表) --do_if_print() -- do_if_fetch() -- if_fetch();
lookup_interface(name) -- if_readlist_proc(name) -- add_interface(name);
其中, if_readlist_proc(name)会检测/proc/net/dev, 察看是否有相应的接口, 并将其用add_interface()加入"有关接口的链表", 比如, 一般有eth0, lo项, 如果成功拨号, 就有ppp0项, 但我估计这只是在ppp是作为模块编译时是如此, 如果编译进了内核, 就始终会有, 不知这样理解是否正确? 至少eth0似乎是这样的. 所以, 只利用/proc/net/dev似乎也不是正确的解决办法.

所以问题的关键就是要研究if_fetch()代码, 我的问题是: 其开始部分使用的ioctl(), 但我不知道其中的skfd是从何而来的? 另外, 其fd = get_socket_for_af()也是需要好好研究的. 不知道有哪位编程高手愿意帮忙看看, 共同研究.

谢谢!
发表于 2004-7-28 20:42:47 | 显示全部楼层
只要网络通了connect一下没返回错误么就说明连到internet了啊
那就开始计时好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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