在linux下使用ifconfigl命令能很方便的查看网卡与网线是否连通,运行ifconfig eth0命令大致输出如下:

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:25:35:68:CC:D6  inet addr:192.168.1.168  Bcast:192.168.1.255  Mask:255.255.255.0inet6 addr: fe80::215:c5ff:fe18:ccd6/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:130722 errors:0 dropped:0 overruns:0 frame:0TX packets:112560 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:104371099 (99.5 MiB)  TX bytes:20518584 (19.5 MiB)Interrupt:16 

其中的RUNNING就表示网卡与网线正常链接,拔掉网线再运行此命令就会发现RUNNING不在了。

我的目的是用C语言来实现程序,而linux系统提供了popen/pclose进程管道让C和shell很方便的交互,不过使用的时候要注意设置权限,以免造成安全隐患。废话不多说,看下面C代码结合shell命令检测网卡与网线连通状况:
netstat.c 

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>/**********************************************************************
* 函数名称: GetNetStat
* 功能描述: 检测网络链接是否断开
* 输入参数:
* 输出参数: 无
* 返 回 值: 正常链接1,断开返回-1
* 其它说明: 本程序需要超级用户权限才能成功调用ifconfig命令
* 修改日期        版本号     修改人          修改内容
* ---------------------------------------------------------------------
* 2010/04/02      V1.0      eden_mgqw
***********************************************************************/
int GetNetStat( )
{char    buffer[BUFSIZ];FILE    *read_fp;int        chars_read;int        ret;memset( buffer, 0, BUFSIZ );read_fp = popen("ifconfig eth0 | grep RUNNING", "r");if ( read_fp != NULL ) {chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp);if (chars_read > 0) {ret = 1;}else{ret = -1;}pclose(read_fp);}else{ret = -1;}return ret;
}int main()
{int i=0;i = GetNetStat();printf( "\nNetStat = %d\n", i );return 0;
}

下面是编译运行程序的输出结果(正常返回1,断开返回-1):
# cc netstat.c 
# ./a.out 
NetStat = 1


C语言实现:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#include <errno.h>
#include <string.h>
#include <ctype.h>#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
#include <linux/sockios.h>
#include <arpa/inet.h>static void die(const char *s)
{fprintf(stderr,"error: %s (%s)\n", s, strerror(errno));exit(-1);
}static void setflags(int s, struct ifreq *ifr, int set, int clr)
{if(ioctl(s, SIOCGIFFLAGS, ifr) < 0) die("SIOCGIFFLAGS");ifr->ifr_flags = (ifr->ifr_flags & (~clr)) | set;if(ioctl(s, SIOCSIFFLAGS, ifr) < 0) die("SIOCSIFFLAGS");
}static inline void init_sockaddr_in(struct sockaddr_in *sin, const char *addr)
{sin->sin_family = AF_INET;sin->sin_port = 0;sin->sin_addr.s_addr = inet_addr(addr);
}static void setmtu(int s, struct ifreq *ifr, const char *mtu)
{int m = atoi(mtu);ifr->ifr_mtu = m;if(ioctl(s, SIOCSIFMTU, ifr) < 0) die("SIOCSIFMTU");
}
static void setdstaddr(int s, struct ifreq *ifr, const char *addr)
{init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_dstaddr, addr);if(ioctl(s, SIOCSIFDSTADDR, ifr) < 0) die("SIOCSIFDSTADDR");
}static void setnetmask(int s, struct ifreq *ifr, const char *addr)
{init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_netmask, addr);if(ioctl(s, SIOCSIFNETMASK, ifr) < 0) die("SIOCSIFNETMASK");
}static void setaddr(int s, struct ifreq *ifr, const char *addr)
{init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_addr, addr);if(ioctl(s, SIOCSIFADDR, ifr) < 0) die("SIOCSIFADDR");
}int main(int argc, char *argv[])
{struct ifreq ifr;int s;unsigned int addr, mask, flags;char astring[20];char mstring[20];char *updown, *brdcst, *loopbk, *ppp, *running, *multi;argc--;argv++;if(argc == 0) return 0;memset(&ifr, 0, sizeof(struct ifreq));strncpy(ifr.ifr_name, argv[0], IFNAMSIZ);ifr.ifr_name[IFNAMSIZ-1] = 0;argc--, argv++;if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {die("cannot open control socket\n");}if (argc == 0) {if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {perror(ifr.ifr_name);return -1;} elseaddr = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;if (ioctl(s, SIOCGIFNETMASK, &ifr) < 0) {perror(ifr.ifr_name);return -1;} elsemask = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {perror(ifr.ifr_name);return -1;} elseflags = ifr.ifr_flags;sprintf(astring, "%d.%d.%d.%d",addr & 0xff,((addr >> 8) & 0xff),((addr >> 16) & 0xff),((addr >> 24) & 0xff));sprintf(mstring, "%d.%d.%d.%d",mask & 0xff,((mask >> 8) & 0xff),((mask >> 16) & 0xff),((mask >> 24) & 0xff));printf("%s: ip %s mask %s flags [", ifr.ifr_name,astring,mstring);updown =  (flags & IFF_UP)           ? "up" : "down";brdcst =  (flags & IFF_BROADCAST)    ? " broadcast" : "";loopbk =  (flags & IFF_LOOPBACK)     ? " loopback" : "";ppp =     (flags & IFF_POINTOPOINT)  ? " point-to-point" : "";running = (flags & IFF_RUNNING)      ? " running" : "";multi =   (flags & IFF_MULTICAST)    ? " multicast" : "";printf("%s%s%s%s%s%s]\n", updown, brdcst, loopbk, ppp, running, multi);return 0;}while(argc > 0) {if (!strcmp(argv[0], "up")) {setflags(s, &ifr, IFF_UP, 0);} else if (!strcmp(argv[0], "mtu")) {argc--, argv++;if (!argc) {errno = EINVAL;die("expecting a value for parameter \"mtu\"");}setmtu(s, &ifr, argv[0]);} else if (!strcmp(argv[0], "-pointopoint")) {setflags(s, &ifr, IFF_POINTOPOINT, 1);} else if (!strcmp(argv[0], "pointopoint")) {argc--, argv++;if (!argc) {errno = EINVAL;die("expecting an IP address for parameter \"pointtopoint\"");}setdstaddr(s, &ifr, argv[0]);setflags(s, &ifr, IFF_POINTOPOINT, 0);} else if (!strcmp(argv[0], "down")) {setflags(s, &ifr, 0, IFF_UP);} else if (!strcmp(argv[0], "netmask")) {argc--, argv++;if (!argc) {errno = EINVAL;die("expecting an IP address for parameter \"netmask\"");}setnetmask(s, &ifr, argv[0]);} else if (isdigit(argv[0][0])) {setaddr(s, &ifr, argv[0]);setflags(s, &ifr, IFF_UP, 0);}argc--, argv++;}return 0;
}

Linux下ipconfig分析及C语言实现相关推荐

  1. linux下ipconfig的常用参数,Linux下ipconfig分析及C语言实现

    在linux下使用ifconfigl命令能很方便的查看网卡与网线是否连通,运行ifconfig eth0命令大致输出如下: # ifconfig eth0 eth0 Link encap:Ethern ...

  2. 在linux下,如何在C语言中使用正则表达式

    http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...

  3. Linux 下编译并运行C语言程序

    Linux下编译并运行C语言程序 ,以Centos 系统为例 1>新建一个hello.c文件 可以直接用图形用户界面新建也可以使用命令新建. 用命令行的话,要用到Linux下的vi编辑器的相关命 ...

  4. 手把手教你如下在Linux下如何写一个C语言代码,编译并运行

    文章目录 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 打开Ubuntu终端 创建 helloworld.c 编译C文件 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 ...

  5. c语言linux下可用函数,[原创]linux下编码转换问题,C语言实现,使用iconv函数族68...

    [原创]linux下编码转换问题,C语言实现,使用iconv函数族68 (2012-07-30 02:49:00) 标签: linux 68 c语言 杂谈 #include #include #inc ...

  6. (转)linux下vi编辑器编写C语言的配置

    在linux下用vi编辑C语言很不方便,关键字不高亮(默认情况下),括号不匹配,上下行不对齐,等等--今天在网上找了些对VI进行简单配置,以方便编写C语言. 打开,一个新的终端(root用户登录),在 ...

  7. Linux下性能分析工具

    Linux下性能分析工具 1.iotop IO性能分析工具 yum -y install epel-release yum -y install iotop iotop 2.nload 网络流量分析工 ...

  8. vss2010c语言怎么运行,在Linux下使用gcc运行C语言程序

    Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具.本教程毫不犹豫地使用GCC来编译C程序. ...

  9. eclipse内存设置Linux,Eclipse CDT Linux下内存分析 补记

    常用工具汇总 常用的内存分析工具 PurifyPlus 不支持常用的Linux 64系统[Ubuntu redhat],悲剧 Valgrind简介 Memcheck Memcheck 工具主要检查下面 ...

最新文章

  1. 从零开始的ROS四轴机械臂控制-目录
  2. 今天做项目时,用到了好多关于js的知识点,有的忘记了,然后晚上回来自己整理一番,明天继续整理。哈哈,分享给大家。...
  3. 用html和js写一个直接在页面运行js的页面
  4. python3 shell 正则表达式 攫取复杂字符串特定子串
  5. eclipse恢复界面默认设置
  6. 数据科学环境Anaconda及其相关组件介绍
  7. 第四次测试--面向对象
  8. 简单图形打印(需求分解)
  9. Tomcat优化之配置线程池高并发连接
  10. JAVA手机接码平台源码
  11. ArcGIS重采样栅格后栅格数目居然不变(解决)
  12. ES 经纬度距离 php,php 根据两点的经纬度计算距离
  13. python模拟人工滑动_python selenium模拟滑动操作
  14. python中def fun()是什么意思_python def 参数
  15. 人工智能相关数据集分享(三)
  16. notebook pip install 只有星号_只有300人的”乡镇企业“:1件卖8亿垄断全球,帮三星称王,比光刻机还重要...
  17. dpdk example——l3fwd
  18. C# dateTime类型之subTract用法
  19. [转]告别写计划的烦恼!一页纸四步打造出一份牛逼的商业计划
  20. rundll32.exe命令使用简介

热门文章

  1. iOS应用安全之代码混淆实现篇
  2. angular2 表单
  3. Error: SyntaxError: DOM Exception 12 ...
  4. 【斗医】【13】Web应用开发20天
  5. nginx 配置的server_name参数(转)
  6. ubuntu 10.04 常用 设置
  7. Spring boot + Redis
  8. mysql修改表结构语句
  9. 同花顺函数API(转载)
  10. php开发以太坊无法连接到远程Geth,connect: permission denied.