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;
}
Linux C程序如何检测WIFI无线USB网卡是否可用?的更多相关文章
- TL-WDN5200H无线usb网卡在Linux上的使用
买了个TL-WDN5200H无线usb网卡,但是发现它居然不支持Linux,但是我有时需要在Linux上使用,这就尴尬了.于是到网上搜索资料,终于解决了这个问题. 首先编译安装:https://git ...
- linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)
本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...
- 最近在无线USB网卡投入比较大
第一次(40): 乐光N18网卡 17 5米USB延长线 10 DVD2 3 运费10 第二次(30): 8187L主板13 5DB/6DB全向天线 5 外壳FREE 运费12 第三次(20): 8D ...
- 【智能无线小车系列八】在树莓派上使用USB网卡
在这个腾“云”驾“物”(云:云计算,物:物联网)的时代,什么都可以没有,就是不能没有网络,树莓派也离不开它.本章节将详细介绍如何将树莓派接入互联网,因为有一些后期将要使用到的小软件需要联网进行下载和安 ...
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(二)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第二篇,主要讲述发送端程序的原理和过程. 第一 ...
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(一)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第一篇,作为前言和概述. 第二篇:基于Oran ...
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第三篇,主要讲述接收端程序的原理和过程. 第一 ...
- 【树莓派】【转】利用USB网卡配置树莓派为无线热点
由于Wifi很慢,基本不可用:树莓派有无线网卡,恰好看到有文章用树莓派来做无线热点,利用树莓派来共享无线网络.比较有用,转发后续尝试. 本文转自:https://www.embbnux.com/201 ...
- 如何在 Arch Linux 的终端里设定 WiFi 网络
如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi.尽管整个过程有点简单,不过我还是要讲一下.在这篇文章里,我将带领新手们通过一步步的设置向导,把 ...
随机推荐
- java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream
管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把 ...
- MongoDB安装(Linux)
下载文件 http://downloads.mongodb.org/linux/mongodb-linux-i686-static-2.5.0.tgz 解压: tar -zxvf mongodb-li ...
- 关于JS中变量的作用域-实例
先看问题,如下,自己运行一下吧! if (!('_qyzA' in window)) { var _qyzA = 1; } alert(_qyzA);//undefined 分析:首先,所有的全局变量 ...
- lintcode 中等题:Min stack 最小栈
题目 带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 解题 可以定义 ...
- 如何获取多核、多cpu系统中指定cpu的序列号
如何获取多核.多cpu系统中指定cpu的序列号作者:SkyJacker(转贴请保持完整并注明作者和出处)http://www.cnpack.orgCnPack IV QQ Group: 130970 ...
- JS模块化编程
AMD:异步模块定义,适合客户端环境,不会阻塞运行.客户端受网络影响比较大. CommonJs:适用于服务器端规范,可以同步加载,只受硬盘读写的影响.
- ActiveMQ集群(2)
ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-Slave和Broker Cluster. 1.Master-Slave ...
- Android中ProgressDialog的简单示例
网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下: 建立android工程等工作都略去,Google一下就可以了. 下面来介绍主 ...
- UVa 1401 (Tire树) Remember the Word
d(i)表示从i开始的后缀即S[i, L-1]的分解方法数,字符串为S[0, L-1] 则有d(i) = sum{ d(i+len(x)) | 单词x是S[i, L-1]的前缀 } 递推边界为d(L) ...
- UVa 1152 4 Values whose Sum is 0
题意:给出n,四个集合a,b,c,d每个集合分别有n个数,分别从a,b,c,d中选取一个数相加,问使得a+b+c+d=0的选法有多少种 看的紫书,先试着用hash写了一下, 是用hash[]记录下来a ...