|
我前几天考虑用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()也是需要好好研究的. 不知道有哪位编程高手愿意帮忙看看, 共同研究.
谢谢! |
|