Linux C程序如何检测WIFI无线USB网卡是否可用?

最新做一个WIFI应用项目。如何检测WIFI USB设备是否插上了呢?特此共享。

      第一种方法,采用读取文件的方式。在linux下,任何一种设备都可看成文件。通过分析相关文件信息,可得知WIFI设备是否存在;代码示例如下:

   

static void WIFI_Enum_Device(void)
{
    char  buff[1024];
    FILE * fh;

 

    /* Check if /proc/net/wireless is available */
    fh = fopen(PROC_NET_WIRELESS, "r");

    if(fh != NULL)
    {
        /* Success : use data from /proc/net/wireless */

        /* Eat 2 lines of header */
        fgets(buff, sizeof(buff), fh);
        fgets(buff, sizeof(buff), fh);

        /* Read each device line */
        while(fgets(buff, sizeof(buff), fh))
        {
            char name[IFNAMSIZ + 1];
            char *s;

            /* Skip empty or almost empty lines. It seems that in some
            * cases fgets return a line with only a newline. */
            if((buff[0] == '\0') || (buff[1] == '\0'))
                continue;

            /* Extract interface name */
            s = WIFI_Get_DeviceName(name, sizeof(name), buff);

            if(!s)
            {
            /* Failed to parse, complain and continue */
#ifndef IW_RESTRIC_ENUM
                fprintf(stderr, "Cannot parse " PROC_NET_DEV "\n");
#else
                fprintf(stderr, "Cannot parse " PROC_NET_WIRELESS "\n");
#endif
            }
            else
                /* Got it, save the name about this interface */

            {//we always use the first detected device when doing first time detecting
                if(s_DeviceCount == 0)
                {
                    if(strcmp(s_Deviceinfo.DeviceName,name))
                    {
                        memset((char *)&s_Deviceinfo, 0, sizeof(DeviceInfo_t));

                        memcpy(s_Deviceinfo.DeviceName,name,IFNAMSIZ);
                    }
                    if(strlen(s_SavedDevice) == 0)//this is the first detected device when doing first time detecting, we save it
                        memcpy(s_SavedDevice,name,IFNAMSIZ);
                }
                else
                {//there is more than one device, we should use the first detected
                    if(!strcmp(s_SavedDevice,name))
                    {
                        memset((char *)&s_Deviceinfo, 0, sizeof(DeviceInfo_t));

                        memcpy(s_Deviceinfo.DeviceName,name,IFNAMSIZ);
                    }
                }
                s_DeviceCount++;
            }
        }

        fclose(fh);
    }
   
}

 

static char* WIFI_Get_DeviceName(char * name, /* Where to store the name */
       int nsize, /* Size of name buffer */
       char * buf) /* Current position in buffer */
{
    char * end;

    /* Skip leading spaces */
    while(isspace(*buf))
        buf++;

#ifndef IW_RESTRIC_ENUM
    /* Get name up to the last ':'. Aliases may contain ':' in them,
    * but the last one should be the separator */
    end = strrchr(buf, ':');
#else
    /* Get name up to ": "
    * Note : we compare to ": " to make sure to process aliased interfaces
    * properly. Doesn't work on /proc/net/dev, because it doesn't guarantee
    * a ' ' after the ':'*/
    end = strstr(buf, ": ");
#endif

    /* Not found ??? To big ??? */
    if((end == NULL) || (((end - buf) + 1) > nsize))
        return(NULL);

    /* Copy */
    memcpy(name, buf, (end - buf));
    name[end - buf] = '\0';

    /* Return value currently unused, just make sure it's non-NULL */
    return(end);
}

 

RETURN_TYPE APP_WIFI_DetectDevice(void)
{
    char command[50] = {'\0'};
    s_DeviceCount = 0;  //reset count
    WIFI_Enum_Device();
    s_LastDeviceCount = s_DeviceCount;
    if(s_DeviceCount > 0)
    {
        sprintf(command,"ifconfig %s up",s_Deviceinfo.DeviceName);
        system(command);  //boot up the device firstly
        return SYS_NOERROR;
    }
    else
        return SYS_FAILED;        
}

      第二种方法,利用linux ioctl函数读取I/O接口的相关信息。

 

/*****************************************************************************
*  Name        : trid_char * APP_NetLink_GetIFFLAGS(char *NetDev )
*  Description : Get net interface IFFLAGS
*  Params      : NetDev
*  Returns     : the string of the NetDev
*  Author/date : Danny.Hu /2011.11.16
*****************************************************************************/
RETURN_TYPE APP_NetLink_GetIFFlags( trid_char *NetDev )
{
    int fd = -1;
    int InterfaceFlags;
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, NetDev);
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd < 0) 
    {
        printf("Cannot get control socket\n");
        close(fd);
        return SYS_FAILED;
    }
    else if( 0!=(ioctl(fd, SIOCGIFFLAGS, (char*)&ifr)) )
    {
       printf("Cannot get Network Interface Flags!\n");
       close(fd);
       return SYS_FAILED;
    }
    
    InterfaceFlags = ifr.ifr_flags; 
    
    printf("<");
    if ( InterfaceFlags & IFF_UP)                        printf("Network %s is UP, ", NetDev);
    if ( InterfaceFlags & IFF_BROADCAST)     printf("Network %s is BCAST, ", NetDev);
    if ( InterfaceFlags & IFF_MULTICAST)      printf("Network %s is MCAST, ", NetDev);
    if ( InterfaceFlags & IFF_LOOPBACK)       printf("Network %s is LOOP, ", NetDev);
    if ( InterfaceFlags & IFF_POINTOPOINT)   printf("Network %s is P2P, ", NetDev);
    printf(">\n");
    close(fd);
    return  SYS_NOERROR;
}

时间: 2024-10-03 06:45:24

Linux C程序如何检测WIFI无线USB网卡是否可用?的相关文章

Win7系统下无线USB网卡如何使用

  随着计算机技术的不断发展,现在越来越多的台式电脑也开始使用到无线的鼠标.键盘,现在已经开始有台式电脑使用到无线的USB网卡来通过WIFI连接到互联网中,那么在Win7系统中怎么使用无线USB网卡来呢?下面我们就来看下. 步骤一:首先将无线USB网卡接入电脑之中,然后使用网卡自带的光盘来安装驱动,或者直接到网上搜索该品牌网卡的驱动进行安装,驱动安装完成之后,重启ghost win7; 步骤二:重启完成之后在桌面,鼠标右键点击"计算机"选择菜单中的"属性",点击属性

如何在Arch Linux的终端里设定WiFi网络

如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi.尽管整个过程有点简单,不过我还是要讲一下.在这篇文章里,我将带领新手们通过一步步的设置向导,把你们的 Arch Linux 接入到你的 WiFi 网络里. 在 Linux 里有很多程序来设置无线连接,我们可以用 ip 和 iw 来配置因特网连接,但是对于新手来说有点复杂.所以我们会使用 netctl 命令,这是一个基于命令行的工具,用来通过配置文件来设置和管理网络连接. 注意:所有的设定都需

wifi无线网络无法上网怎么办

  现在wifi已经走进各家各户,普及率非常的高,但是WIFI无线网络难免会出现故障,这就给很多经常接触电脑又不是很熟悉电脑的朋友带来了一些麻烦,所以我们必须要学会自己去学会wifi的一些基本设置与问题解决方法. 1.无线路由器不能上网之无法浏览网页 网页以不能正常打开,但是QQ之类的程序却可以正常运行. 这种情况是路由器上的DNS解析问题,如果将网关设置成DNS地址,这是DNS Proxy,并非真实的DNS地址,就可能会导致地址解析出错.要解决这个问题,建议在路由器和计算机网卡上手动设置DNS

Rational的Linux应用程序开发解决方案

用于Linux 开发的Rational 工具 Rational 软件提供了综合的解决方案,让您可以利用 Linux 构建.集成.扩展.改造和部署软件.凭借对软件生命周期中所有角色和活动的广泛支持,IBM 软件开发平台.Rational 产品支持开发和 Linux 环境下的开发. Rational 对Linux 的支持主要集中在以下两个方面:通过综合的 IDE 支持方便了 Linux应用程序的开发:通过为管理软件资产提供基于Linux 的平台支持降低了软件开发基础设施的总体拥有成本. Ration

Android系统移植与调试之-------&amp;gt;如何添加一个adb wifi无线调试的功能【开发者选项】-【Wifi调试】

首先弄懂怎么设置adb wifi无线调试的功能,如下所示. 1. 手机端开启adb tcp连接端口 :/$setprop service.adb.tcp.port 5555 :/$stop adbd :/$start adbd 其中setprop是用来设置系统属性的,这里不需要root权限,su即可.可通过adb shell设置,亦可通过手机上安装的Android terminal设置. 2. 电脑端的设置和使用 连接adb,其中phone_ipaddress和portnumber是指手机的ip

Linux终端:speedtest_cli检测你的实时带宽速度

Linux终端:speedtest_cli检测你的实时带宽速度 你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web浏览器和手机应用程序浏览的web服务. 现在,你可以很容易地检测你的网速,使用speedtest_cli同样很简单,它是一个使用speedtest.net来测试因特网带宽的命令行界面.通过这种方式,你也可以在没有浏览器或者图形化界面的服

《嵌入式 Linux应用程序开发标准教程(第2版)》——1.1 嵌入式Linux基础

1.1 嵌入式Linux基础 嵌入式 Linux应用程序开发标准教程(第2版) 自由开源软件在嵌入式应用上受到青睐,Linux日益成为主流的嵌入式操作系统之一.随着MOTOROLA手机A760.IBM智能型手表WatchPad.SharpPDA Zaurus等一款款高性能"智能数码产品"的出现,以及Motorola.Samsung.MontaVista.Philips.Nokia.IBM.SUN等众多国际顶级巨头的加入,嵌入式Linux的队伍越来越庞大了.目前,国外不少大学.研究机构和

《嵌入式 Linux应用程序开发标准教程(第2版)》——2.2 Linux启动过程详解

2.2 Linux启动过程详解 嵌入式 Linux应用程序开发标准教程(第2版) 在了解了Linux的常见命令之后,下面详细讲解Linux的启动过程.Linux的启动过程包含了Linux工作原理的精髓,而且在嵌入式开发过程中非常需要这方面的知识. 2.2.1 概述 用户开机启动Linux过程如下: (1)当用户打开PC(intel CPU)的电源时,CPU将自动进入实模式,并从地址0xFFFF0000开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址.这时BIOS进行开机自检,并按BI

Kali Linux中的十大WiFi攻击工具介绍

本文讲的是Kali Linux中的十大WiFi攻击工具介绍,在这十大WiFi攻击黑客工具中,我们将讨论一个非常受欢迎的主题:无线网络攻击以及如何防止黑客入侵.无线网络通常是网络的一个弱点,因为WiFi信号可以随处可见,任何人都可以使用.还有很多路由器包含漏洞,可以利用正确的设备和软件(如Kali Linux附带的工具)轻松利用漏洞.许多路由器制造商和ISP仍然默认在其路由器上启用了WPS,这使得无线安全和渗透测试变得更加重要.通过以下十大无线网络黑客工具,你可以测试我们自己的无线网络以获取潜在的