转自:http://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network-cable-connector

You want to look at the nodes in

/sys/class/net/

I experimented with mine:

Wire Plugged in:

eth0/carrier:1
eth0/operstate:unknown

Wire Removed:

eth0/carrier:0
eth0/operstate:down

Wire Plugged in Again:

eth0/operstate:up
eth0/carrier:1

GTK 程序 检测 网线是否连接 本地网络状态 C语言实现

转自:http://blog.csdn.net/a954423389/article/details/7327950

主程序创建一个进程, 每2秒查看一下网络状态,然后打印输出

通过检查文件

/sys/class/net/wlan0/operstate  (无线网络)

/sys/class/net/eth0/operstate (有线网络)

通过检查文件的内容   判断当前网络是否连接

值为up的时候,是连接 值为down的时候 是断开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <gtk/gtk.h>
  5. #include <fcntl.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #define WIRELESS
  9. #ifdef WIRELESS
  10. #define INTERNET_STATUS_FILE "/sys/class/net/wlan0/operstate"
  11. #else
  12. #define INTERNET_STATUS_FILE "/sys/class/net/eth0/operstate"
  13. #endif
  14. #include <sys/wait.h>
  15. static GtkWidget *fixed;
  16. static GtkWidget *button1;
  17. static GtkWidget *button2;
  18. int running = 1;
  19. void ring()
  20. {
  21. GtkWidget *window;
  22. GtkWidget *table;
  23. GtkWidget *button_cancel;
  24. GtkWidget *label;
  25. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  26. gtk_window_set_default_size (GTK_WINDOW(window),100,100);
  27. gtk_window_set_position (GTK_WINDOW(window),GTK_WIN_POS_CENTER_ALWAYS);
  28. table = gtk_table_new(10,10,TRUE);
  29. gtk_container_add (GTK_CONTAINER (window),table);
  30. label = gtk_label_new("ring");
  31. button_cancel = gtk_button_new_with_label ("quit");
  32. gtk_table_attach_defaults (GTK_TABLE(table),button_cancel,2,4,7,9);
  33. gtk_widget_show_all(window);
  34. }
  35. void www_connect_check_real ()
  36. {
  37. int ret = -2;
  38. while (1)
  39. {
  40. //一定要只读模式打开,读写模式打开不可以
  41. ret = open ("/sys/class/net/wlan0/operstate",O_RDONLY);
  42. if (ret<0) {
  43. printf("open file operstate failure%d\n",ret);
  44. return;
  45. }
  46. char status[3]="wl\0";
  47. //printf("%s",status);
  48. read (ret,status,2);
  49. status[3] = '\0';
  50. if (0== strcmp("up",status))
  51. {
  52. printf("on line now \n");
  53. }
  54. else if (0== strcmp("do",status))
  55. {
  56. printf("off off \n");
  57. }
  58. else
  59. printf("unknow error\n");
  60. close (ret);
  61. sleep (5);
  62. }
  63. }
  64. int main(int argc,char* argv[])
  65. {
  66. GtkWidget *window,*view;
  67. GtkWidget *vbox,*button,*label;
  68. /*线程初始化*/
  69. if (!g_thread_supported())
  70. g_thread_init(NULL);
  71. gdk_threads_init();
  72. gtk_init(&argc,&argv);
  73. window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  74. gtk_window_set_title(GTK_WINDOW(window),"thread apllication");
  75. vbox=gtk_vbox_new(FALSE,0);
  76. gtk_container_add(GTK_CONTAINER(window),vbox);
  77. label=gtk_label_new("Notice! Button is moving");
  78. gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
  79. view=gtk_viewport_new(NULL,NULL);
  80. gtk_box_pack_start(GTK_BOX(vbox),view,FALSE,FALSE,0);
  81. fixed=gtk_fixed_new();
  82. gtk_widget_set_usize(fixed,330,330);
  83. gtk_container_add(GTK_CONTAINER(view),fixed);
  84. button1=gtk_button_new_with_label("1");
  85. button2=gtk_button_new_with_label("2");
  86. gtk_fixed_put(GTK_FIXED(fixed),button1,10,10);
  87. gtk_fixed_put(GTK_FIXED(fixed),button2,40,40);
  88. GtkWidget *button_ring = gtk_button_new_with_label ("ring");
  89. gtk_box_pack_start(GTK_BOX(vbox),button_ring,FALSE,FALSE,5);
  90. g_signal_connect (button_ring,"clicked",G_CALLBACK(ring),NULL);
  91. /*创建线程*/
  92. g_thread_create((GThreadFunc)www_connect_check_real,NULL,FALSE,NULL);
  93. gtk_widget_show_all(window);
  94. g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
  95. gtk_container_set_border_width(GTK_CONTAINER(window),10);
  96. gdk_threads_enter();
  97. gtk_main();
  98. gdk_threads_leave();
  99. return FALSE;
  100. }

注意:

1,ubuntu 10.04上,当使用静态IP的时候,即使 连接着网络, 文件的值也不up 而是unknown, 这是驱动上的bug,ubuntu 11.10上就正常

http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/5.7_Technical_Notes/kernel.html

2,相关链接

http://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network-cable-connector

http://www.linuxforums.org/forum/programming-scripting/142431-how-write-program-c-detect-ethernet-cable.html

3,也可以使用shell脚本来检测,网上例子很多

4,也可以编写一个内核模块来检测,后期再说,先找工作

http://stackoverflow.com/questions/7225888/how-can-i-monitor-the-nic-statusup-down-in-a-c-program-without-polling-the-ker

5,

[cpp] view plain copy

 
  1. //RFC 2863操作状态
  2. unsigned char       operstate;
  3. /* operstate的可能取值如下:
  4. enum {
  5. IF_OPER_UNKNOWN,
  6. IF_OPER_NOTPRESENT,
  7. IF_OPER_DOWN,
  8. IF_OPER_LOWERLAYERDOWN,
  9. IF_OPER_TESTING,
  10. IF_OPER_DORMANT,
  11. IF_OPER_UP,
  12. };
  13. **/
  14. //映射到RFC2863兼容状态的策略
  15. unsigned char       link_mode;
  16. /* link_mode的可能取值如下:
  17. enum {
  18. IF_LINK_MODE_DEFAULT,
  19. IF_LINK_MODE_DORMANT,
  20. };
  21. **/

我们检测的文件内容,其实是这个成员变变量的值,返回值比较多,程序中只是判断了前两个字符

http://blog.csdn.net/npy_lp/article/details/7056903

linux c 检测网络状态

转自:https://blog.csdn.net/linqiongjun86/article/details/48393807

获取wifi网络状态

#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void connect_check_real ()  
{  
        int ret;  
    int fp;
    char status[10];  
        //一定要只读模式打开,读写模式打开不可以  
    ///sys/class/net/wlan0/carrier  0:down 1:up 
        fp = open ("/sys/class/net/wlan0/operstate",O_RDONLY);  
  
        if (fp<0) {  
        printf("open file operstate failure%d\n",fp);  
        return;  
        }  
        
    memset(status,0,sizeof(status));
        ret = read (fp,status,10);   
    printf("status:%s\n",status);
        if (NULL != strstr(status,"up"))  
        {  
            printf("on line now \n");  
        }  
        else if (NULL != strstr(status,"down"))  
        {  
            printf("off off \n");  
        }  
        else   
        printf("unknow error\n");  
        close (fp);      
}

linux c 检测网络状态的更多相关文章

  1. iOS开发——网络篇——数据安全(MD5),HTTPS,检测网络状态

    一.数据安全 1.提交用户的隐私数据一定要使用POST请求提交用户的隐私数据GET请求的所有参数都直接暴露在URL中请求的URL一般会记录在服务器的访问日志中服务器的访问日志是黑客攻击的重点对象之一 ...

  2. iOS开发网络篇—Reachability检测网络状态

    前言:当应用程序需要访问网络的时候,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理.最好能监听设备的网络状态的改变,当设备网络状态连接.断开时,程序也 ...

  3. [iOS 多线程 & 网络 - 2.8] - 检测网络状态

    A.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的:(1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能)(2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验 ...

  4. iOS 检测网络状态 自动判断 认为提示网络改变

    检测网络状态 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是让用户了解自己的网络状态,防止一些误会(比如怪应用无能)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验WIFI\3G ...

  5. iOS开发 - 检测网络状态(WIFI、2G/3G/4G)

    本文转载至 http://blog.csdn.net/wangzi11322/article/details/45580917 检测网络状态 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是 ...

  6. iOS网络4——Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发. 其实在网络开发中还有比较常用的就是网络 ...

  7. iOS Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发.其实在网络开发中还有比较常用的就是网络状 ...

  8. iOS 检测网络状态

    一般有两种方式,都是第三方的框架,轮子嘛,能用就先用着,后面再优化. 一:Reachability 1.首先在AppDelegate.h添加头文件"Reachability.h", ...

  9. Reachability 检测网络状态

    -(void)viewWillAppear:(BOOL)animated { [IOSExcept JudgeNetwork];//联网 NSLog(@"检查网络 请稍后....." ...

随机推荐

  1. [javase学习笔记]-8.6 静态的内存载入

    之前几节我们一直在说statickeyword所修饰的静态,那么在程序执行时,内存中static是怎样体现的呢?这一节我们就来看一看. 我们还是先看一个样例.希望我们通过对这个样例的分析让我们刚開始学 ...

  2. asp.net core在linux上的部署调试

    双十一买了阿里云的LINUX服务器三年¥720 把自己的niunan.net一系列网站都部署上去 用jexus来部署,部署时发现头一个网站没问题,但是后一个网站部署就有问题..输入域名打不开,但JEX ...

  3. 深入理解Linux内核-信号

    信号:1.最初被引入作为用户态进程间通信2.内核也使用信号通知进程系统所发生的事件3.信号很短,发送给进程的唯一信息通常是一个数.4.名称通常以SIG为前缀5.信号时可消费资源,每个信号只能被传递一次 ...

  4. MinGW环境libssh2安装

    由于实习工作中要用到基于sftp协议开发一个网络程序,同时要实现运行在Windows平台上,找来找去就这个libssh2库好用,在网络上算是有那么一点点的文档可以看.这个库还不是现成的,还要进行源代码 ...

  5. 菜鸟学SSH(三)——Struts2国际化自动检测浏览器语言版

    前几天发了一篇Struts国际化的博客——<菜鸟学习SSH(二)——Struts2国际化手动切换版>,有网友提了一个意见,见下图: 于是就有了下面修改的版本: web.xml <?x ...

  6. 按键精灵与逍遥安卓ADB连接重键方法

    1.按键精灵与逍遥安卓ADB连接安装按键精灵与逍遥安卓这两个软件我不用多说了.安装好后把逍遥安卓安装目录下的三个文件adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll 全部复 ...

  7. scope_identity() 与 @@identity的区别

    在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值.如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL. ...

  8. (转)Linux下的输入/输出重定向

    Linux环境中支持输入输出重定向,用符号<和>来表示.0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>lee.dat 表示 ...

  9. [翻译] Dremel made simple with Parquet

    首先自己的 blog 好久没有写技术相关的东西了,今天又动笔了,好高兴!然后转载请注明出处.最后开始正题: 原文:Dremel made simple with Parquet | Twitter E ...

  10. java命令执行jar包的方式

    http://www.cnblogs.com/adolfmc/archive/2012/10/07/2713562.html 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有 ...