linux - linux下与wifi接口(interface)绑定(bind)

标签 linux wifi berkeley-sockets

我正在开发一个基于Linux的系统,该系统具有LAN和WIFI接口(interface)。但我必须仅将我的套接字与 wifi 接口(interface)绑定(bind)。有没有什么通用的方法可以找出哪个接口(interface)是wifi,这样我就可以用它来装我的 socket ?如果没有,我是否可以绑定(bind)并接收来自两个接口(interface)的请求?

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

最佳答案

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

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;
}

完整文件位于此处: here

关于linux - linux下与wifi接口(interface)绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140753/

相关文章:

wifi - WIFI直连和WIFI站可以同时工作吗?

ios - 使用零配置模式将 iOS 的 Wi-Fi 设置共享到外部设备

c++ - 在C/C++中获取网关地址

c - 从套接字读取直到某个字符在缓冲区中

c - 套接字编程中shutdown()函数中SHUT_RDWR的用途

php - PHP 中的 authz svn 文件解析器

android studio on linux : Gradle build is too slow. 持续1个多小时

regex - 排除子目录

linux - 当文件名的一部分时,Shell 脚本不执行星号

linux - 机器上的两个 NIC,将它们绑定(bind)到 OS 分配的单独接口(interface)