用c/c++实现linux下检测网络接口状态

时间:2021-09-30 15:22:11
要写个检测网络接口链接状态的东西,又不喜欢不断的ping别的地址,也不想调用其他命令行工具来做这个,于是在google了n多内容未果之后,搜刮到个检测工具的源代码,从里面抠出来一块儿就ok了,版权不是我的哦,哈哈……

以下代码在fedora 9 / CentOS 5.2下调试通过:)
  1. #include <sys/types.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/ioctl.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <net/if.h>

  8. struct ethtool_value {
  9.         __uint32_t      cmd;
  10.         __uint32_t      data;
  11. };

  12. int main(int , char* [])
  13. {
  14.     struct ethtool_value edata;
  15.     int fd = -1, err = 0;
  16.     struct ifreq ifr;

  17.         memset(&ifr, 0, sizeof(ifr));
  18.         strcpy(ifr.ifr_name, "eth0");
  19.         fd = socket(AF_INET, SOCK_DGRAM, 0);
  20.         if (fd < 0) {
  21.                 perror("Cannot get control socket");
  22.                 return 70;
  23.         }

  24.         edata.cmd = 0x0000000a;
  25.         ifr.ifr_data = (caddr_t)&edata;
  26.         err = ioctl(fd, 0x8946, &ifr);
  27.         if (err == 0) {
  28.                 fprintf(stdout, "Link detected: %s/n",
  29.                         edata.data ? "yes":"no");
  30.         } else if (errno != EOPNOTSUPP) {
  31.                 perror("Cannot get link status");
  32.         }
  33.    return 0;
  34. }