linux下wifi接口的绑定

linux下wifi接口的绑定,linux,wifi,berkeley-sockets,Linux,Wifi,Berkeley Sockets,我正在一个基于linux的系统上工作,该系统具有LAN和WIFI接口。但我只能用wifi接口绑定我的插座。有没有什么常规方法可以确定哪个接口是wifi,这样我就可以用它来存放我的插座?如果没有,我是否可以绑定并接收来自两个接口的请求 目前,我正在使用INADDR_ANY进行绑定。我知道如何绑定像eth0这样的特定接口,但是我找不到任何方法来确定eth0是否是wifi接口;至少在C语言中,使用INADDR_ANY,我将接收发送到任何接口的数据包,但我的发送可能会尝试通过LAN接口发送数据包;这不是

我正在一个基于linux的系统上工作,该系统具有LAN和WIFI接口。但我只能用wifi接口绑定我的插座。有没有什么常规方法可以确定哪个接口是wifi,这样我就可以用它来存放我的插座?如果没有,我是否可以绑定并接收来自两个接口的请求


目前,我正在使用INADDR_ANY进行绑定。我知道如何绑定像eth0这样的特定接口,但是我找不到任何方法来确定eth0是否是wifi接口;至少在C语言中,使用INADDR_ANY,我将接收发送到任何接口的数据包,但我的发送可能会尝试通过LAN接口发送数据包;这不是我想要的。

这个片段可以帮助你,它比我想象的更复杂:

if (getifaddrs(&ifaddrs) < 0) {
my_loge(CRIT, "address detection failed");
return(0);
}

// zero
count = 0;

// unset all but CAP_HOST and CAP_ROUTER
sysinfo->cap &= (CAP_HOST|CAP_ROUTER);
sysinfo->cap_active &= (CAP_HOST|CAP_ROUTER);
// reset counter
sysinfo->physif_count = 0;

// mark all interfaces
TAILQ_FOREACH(netif, netifs, entries) {
netif->type = NETIF_OLD;
}

for (ifaddr = ifaddrs; ifaddr != NULL; ifaddr = ifaddr->ifa_next) {

// skip interfaces without addresses
if (ifaddr->ifa_addr == NULL) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}

// only handle datalink addresses
if (ifaddr->ifa_addr->sa_family != NETIF_AF)
    continue;

// prepare ifr struct
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifaddr->ifa_name, sizeof(ifr.ifr_name));


// skip non-ethernet interfaces
memcpy(&saddrll, ifaddr->ifa_addr, sizeof(saddrll));
if (saddrll.sll_hatype != ARPHRD_ETHER) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}
index = saddrll.sll_ifindex;
memcpy(&saddrdl, ifaddr->ifa_addr, sizeof(saddrdl));
if ((saddrdl.sdl_type != IFT_BRIDGE) &&
    (saddrdl.sdl_type != IFT_ETHER)) {
if (saddrdl.sdl_type != IFT_ETHER) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}
index = saddrdl.sdl_index;

// check for interfaces that are down
enabled = 0;
if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t)&ifr) >= 0)
    enabled = (ifr.ifr_flags & IFF_UP);

// detect interface type
type = netif_type(sockfd, index, ifaddr, &ifr);

if (type == NETIF_REGULAR) { 
    my_log(INFO, "found ethernet interface %s", ifaddr->ifa_name);
    sysinfo->physif_count++;
} else if (type == NETIF_WIRELESS) {
    my_log(INFO, "found wireless interface %s", ifaddr->ifa_name);
    sysinfo->cap |= CAP_WLAN;
    sysinfo->cap_active |= (enabled == 1) ? CAP_WLAN : 0;
} else if (type == NETIF_TAP) {
    my_log(INFO, "found tun/tap interface %s", ifaddr->ifa_name);
} else if (type == NETIF_BONDING) {
    my_log(INFO, "found bond interface %s", ifaddr->ifa_name);
} else if (type == NETIF_BRIDGE) {
    my_log(INFO, "found bridge interface %s", ifaddr->ifa_name);
    sysinfo->cap |= CAP_BRIDGE; 
    sysinfo->cap_active |= (enabled == 1) ? CAP_BRIDGE : 0;
} else if (type == NETIF_VLAN) {
    my_log(INFO, "found vlan interface %s", ifaddr->ifa_name);
} else if (type == NETIF_INVALID) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}
if(getifaddrs(&ifaddrs)<0){
我的日志(CRIT,“地址检测失败”);
返回(0);
}
//零
计数=0;
//取消设置除CAP_主机和CAP_路由器以外的所有主机
sysinfo->cap&=(cap|u主机| cap|u路由器);
sysinfo->cap_active&=(cap_主机| cap_路由器);
//复位计数器
sysinfo->physif_count=0;
//标记所有接口
TAILQ_FOREACH(netif、netif、条目){
netif->type=netif\u OLD;
}
对于(ifaddr=IFADRS;ifaddr!=NULL;ifaddr=ifaddr->ifa\U next){
//跳过没有地址的接口
如果(ifaddr->ifa\U addr==NULL){
我的日志(信息,“跳过接口%s”,ifaddr->ifa\u名称);
继续;
}
//仅处理数据链路地址
如果(ifaddr->ifa\U addr->sa\U family!=NETIF\U AF)
继续;
//准备ifr结构
memset(&ifr,0,sizeof(ifr));
strlcpy(ifr.ifr\u名称,ifaddr->ifa\u名称,sizeof(ifr.ifr\u名称));
//跳过非以太网接口
memcpy(&saddrll,ifaddr->ifa_addr,sizeof(saddrll));
if(saddrll.sll_hatype!=ARPHRD_ETHER){
我的日志(信息,“跳过接口%s”,ifaddr->ifa\u名称);
继续;
}
索引=saddrll.sll\u i索引;
memcpy(&saddrl,ifaddr->ifa_addr,sizeof(saddrl));
if((saddrdl.sdl_类型!=IFT_桥)&&
(saddrdl.sdl_型!=IFT_乙醚){
if(saddrdl.sdl_类型!=IFT_乙醚){
我的日志(信息,“跳过接口%s”,ifaddr->ifa\u名称);
继续;
}
索引=saddrdl.sdl_索引;
//检查关闭的接口
启用=0;
如果(ioctl(sockfd,SIOCGIFFLAGS,(caddr\u t)和ifr)>=0)
启用=(ifr.ifr\u标志和IFF\u向上);
//检测接口类型
类型=网络类型(sockfd、索引、ifaddr和ifr);
如果(type==NETIF_正则){
我的日志(信息,“找到以太网接口%s”,ifaddr->ifa\u名称);
sysinfo->physif_count++;
}else if(类型==NETIF_无线){
我的\u日志(信息,“找到无线接口%s”,ifaddr->ifa\u名称);
sysinfo->cap |=cap|WLAN;
sysinfo->cap_active |=(enabled==1)?cap_WLAN:0;
}else if(类型==NETIF_TAP){
我的日志(信息,“找到tun/tap接口%s”,ifaddr->ifa\u名称);
}else if(类型==网络连接){
我的日志(信息,“找到绑定接口%s”,ifaddr->ifa\u名称);
}else if(类型==NETIF_桥){
我的\u日志(信息,“找到网桥接口%s”,ifaddr->ifa\u名称);
sysinfo->cap |=cap|u桥;
sysinfo->cap_active |=(enabled==1)?cap_桥:0;
}else if(类型==NETIF_VLAN){
我的\u日志(信息,“找到vlan接口%s”,ifaddr->ifa\u名称);
}else if(type==NETIF_无效){
我的日志(信息,“跳过接口%s”,ifaddr->ifa\u名称);
继续;
}
完整文件位于此处:

另外,您希望潜在答案使用哪种语言?如果您将套接字绑定到INADDR\u ANY或in6addr\u ANY,它应该绑定到所有可用的接口。@JoachimPileborg标签上写着
C
,如果人们只知道为什么会投反对票,那将是有益的。无线接口应该列在/proc/net/wireless中。您可以随时请阅读。常量(例如NETIF#u WIRELESS)在哪个头文件中找到?可能#include不在我的系统中。我在/usr/include上做了grep,但它们都找不到。可能有个软件包需要安装。