LinuxSir.cn,穿越时空的Linuxsir!

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

用C语言检测是否联接到Internet: 当前的解决和代码

[复制链接]
发表于 2004-7-28 23:28:07 | 显示全部楼层 |阅读模式
最后, 我使用的一个如下的程序, 其思路是: 在子进程中调用exec执行/sbin/ifconfig, 在父进程中调用wait()获得子进程的退出状态, 如果可以找到ppp0, 退出状态为0, 否则为1, 这样就可以在程序中检测了.

  1. /*
  2. * Program:        li.c
  3. *                Lookup Interface.
  4. *
  5. * Version:        Just a test program.
  6. *
  7. * Author:      Zhou Peng
  8. *                <Chowroc@163.com; OICQ:281141985; ICQ:269464589>
  9. *              Copyright 2004
  10. *
  11. * Time:        2004.7.29
  12. *
  13. * This program is free software under the GNU General Public License.
  14. */

  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <sys/types.h>
  18. #include <sys/wait.h>
  19. #include <unistd.h>
  20. #include <string.h>

  21. int main(int argc, char *argv[])
  22. {
  23.     pid_t pid;
  24.     int status;

  25.     if(argc != 2)  {
  26.         printf("usage: li INTERFACE_NAME_TO_LOOKUP(eth0/ppp0/...)\n");
  27.         exit(0);
  28.     }
  29.     if(!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))  {
  30.         printf("usage: li INTERFACE_NAME_TO_LOOKUP(eth0/ppp0/...)\n");
  31.         exit(0);
  32.     }

  33.     if((pid = fork()) < 0)  {
  34.         fprintf(stderr, "fork error!\n");
  35.         exit(1);
  36.     }
  37.     else if(pid == 0)  {  // child.
  38.         if(execlp("/sbin/ifconfig", "ifconfig", argv[1], (char *) 0) < 0)  {
  39.             fprintf(stderr, "execlp error!\n");
  40.             exit(1);
  41.         }
  42.     }

  43.     if(wait(&status) != pid) {
  44.         fprintf(stderr, "wait error!\n");
  45.         exit(1);
  46.     }

  47.     if(WIFEXITED(status))  
  48.         printf("normal termination, exit status = %d\n", WEXITSTATUS(status));
  49.     else if(WIFSIGNALED(status))
  50.         printf("abnormal termination, signal number = %d\n", WTERMSIG(status));
  51.     else if(WIFSTOPPED(status))
  52.         printf("child stopped, signal number = %d\n", WSTOPSIG(status));

  53.     exit(0);
  54. }
复制代码

在我的计算机上这样做是可以的. 我现在的问题是, 我试用eth0接口, 发现无论是其处于down或 up的状态, 都返回0. 那么在其他计算机上, ppp0接口是不是也会有这样的问题呢?
我在LFS下重新编译过内核, 似乎没有这个问题, 但不确切知道.
另外, ifconfig如何检测 eth0 的状态是up/down呢?

谢谢
发表于 2004-7-29 08:51:04 | 显示全部楼层
用 system("/sbin/ifconfig | grep eth0"); 如何?

其实干这事最好用  ioctl();
ifconfig也就这么实现的
 楼主| 发表于 2004-7-29 11:16:51 | 显示全部楼层
用system的问题是我没有办法得到进程退出状态, 从而无法为我以前所说的上网计时程序进行一个是否连接的判断.
至于用 ioctl()的方法, 能否说的详细一点.

谢谢!
发表于 2004-7-29 12:36:03 | 显示全部楼层
1, system("/sbin/ifconfig | grep eth0");
system成功时的返回值就是命令的返回值,
你也可以改成execlp的形式,但要在前面加sh以允许执行管道功能

2, ioctl()参考<UNIX网络编程.第一卷>,直接根据函数索引找到ioctl()
上面有关于如何操作网络接口的说明,还有ifconfig的实现示例
另外可参考 man ioctl 和 /usr/include/bits/ioctls.h

我现在手头没有书,详细的也说不上来
 楼主| 发表于 2004-7-30 18:42:18 | 显示全部楼层
对,是我把system()的返回值记错了,非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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