微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C,Linux知道networking接口是无线还是有线

我有一个程序有两个独立的部分:其中一个应该在networking接口是无线LAN时执行,另一个是有线LAN连接。 我怎么知道我的程序里面? 我应该使用什么函数获取这些信息?

查询服务是否正在运行

.text段地址范围的位置独立可执行文件

C + + Qt WriteProcessMemory

这是确定操作系统架构的好方法吗?

使用GraphicsMagick调整animationGIF的大小

您可以使用命令行中的iwconfig命令:

$ iwconfig lo no wireless extensions. eth0 no wireless extensions.

如果你需要从C使用它,就像上面解释的@ opaque的链接一样,获取代码或者使用strace来查看你需要使用哪个ioctls():

ioctl(3,SIocgIWNAME,0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported) ioctl(3,SIocgIFFLAGS,{ifr_name="lo",ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0 write(2,"lo no wireless extensions"...,35lo no wireless extensions. ) = 35 ioctl(3,{ifr_name="eth0",ifr_flags=IFF_UP|IFF_broADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 write(2,"eth0 no wireless extensions"...,35eth0 no wireless extensions. ) = 35

请参阅SIocgIWNAME用法

#define SIocgIWNAME 0x8B01 /* get name == wireless protocol */ /* SIocgIWNAME is used to verify the presence of Wireless Extensions. * Common values : "IEEE 802.11-DS","IEEE 802.11-FH","IEEE 802.11b"...

如果您的设备名称是NETDEVICE ,则检查/sys/class/net/NETDEVICE/wireless目录的存在是您可以使用的谓词。 不过,这是一种仅限于Linux的方法,并且假设/sys已挂载,这几乎总是正常情况。 从脚本中使用这种方法也比较容易,而不是处理ioctl()。

现在可以从C得到它。

查看这个链接了解类似问题的信息。

您可以调用返回无线扩展协议版本的ioctl(fd,SIocgIWNAME) ,该版本仅在无线接口上可用。

int check_wireless(const char* ifname,char* protocol) { int sock = -1; struct iwreq pwrq; memset(&pwrq,sizeof(pwrq)); strncpy(pwrq.ifr_name,ifname,IFNAMSIZ); if ((sock = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket"); return 0; } if (ioctl(sock,&pwrq) != -1) { if (protocol) strncpy(protocol,pwrq.u.name,IFNAMSIZ); close(sock); return 1; } close(sock); return 0; }

有关完整的示例,请参阅: https : //gist.github.com/edufelipe/6108057

如果您的目标是NetworkManager,请查看其API, C示例和NMDeviceType 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐