Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定网络适配器是否为无线适配器?_Java - Fatal编程技术网

Java 如何确定网络适配器是否为无线适配器?

Java 如何确定网络适配器是否为无线适配器?,java,Java,有许多方法可以获取机器的网络适配器和相关信息,如Sigar和java.net的getNetworkInterfaces()。但是,使用这两种方法中的任何一种,我都无法确定某个适配器是否是无线的(除非名称/描述明确说明) 有没有办法通过代码来确定这一点?(我希望能够在Windows和Linux中都这样做,但我愿意处理特定于系统的解决方案)。编辑:删除了不相关的部分 也许您可以使用JNI(java本机接口)调用一个C函数来获取这个标志。。。使用C,这应该是可能的(尽管代码可能变得不可移植) 编辑:对

有许多方法可以获取机器的网络适配器和相关信息,如Sigar和java.net的getNetworkInterfaces()。但是,使用这两种方法中的任何一种,我都无法确定某个适配器是否是无线的(除非名称/描述明确说明)

有没有办法通过代码来确定这一点?(我希望能够在Windows和Linux中都这样做,但我愿意处理特定于系统的解决方案)。

编辑:删除了不相关的部分

也许您可以使用JNI(java本机接口)调用一个C函数来获取这个标志。。。使用C,这应该是可能的(尽管代码可能变得不可移植)

编辑:对于linux,我发现了以下内容。下载了无线工具的源代码,包括iwconfig。其中包括库iwlib.c,它只是从/proc/net/wireless或/proc/net/dev中提取接口的名称

你可以从,这是从Fedora得到的。当库从标准化文件系统的路径提取数据时,您唯一需要的就是对procfs的内核支持

现在我只能引导您找到文件“iwlib.c”,函数

void iw_enum_devices(int skfd, iw_enum_handler fn, char * args[], int count)
我不知道这些参数,但是源代码已经注释过了。也许您必须将从java获得的列表与通过这个JNI黑客程序收到的列表进行比较

我猜这是一个“小任务”的大量工作;希望你能找到你的出路


关于

如果您想构建特定于平台的功能JNI实现,可以用来获取无线网络接口列表的Windows API函数是Wlanapi.h中的wlanenuminterface。您需要链接Wlanapi.lib/.dll。另外,请参见

我建议您构建一个带有两个函数的小型JNI库:

getWirlessInterfaceCount();
getWirelessInterfaceAddr(int nIf, char *addr);
实际上,您要确保地址的6个字节是在Java端分配的,而只是在本机端填充。这样,您就不必担心本机端的内存管理。您可以将这两个JNI调用封装在Java方法中,如

List<NetworkInterface> getWirelesNetworkInterfaces();
列出getWirelesNetworkInterfaces();

。。。。它调用两个JNI方法,通过NetworkInterface API获取所有接口的列表,并抛出JNI方法未返回地址的所有接口。

虽然这个问题已经很老了,但可能有人在寻找这个解决方案,所以这里有一个简单的方法可以在Windows中找到它

在当前NetworkInterface类中,函数getName()将返回唯一的名称,这些名称可以是“eth0”、“wlan0”或“net0”,总是几个字母加上一个数字。 收集网络接口列表并选择真实接口后,您可以检查getName()函数对于有线接口是否返回“ethX”,对于无线接口是否返回“wlanX”(X是一个数字,取决于您的计算机中有多少接口)

下面的代码是一个示例,说明了如何进行此标识,虽然首先需要找到哪些接口是真实的,但有很多解决方案

import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

public class TesteInterfaces {

public static void main(String[] args) {
    Enumeration<NetworkInterface> tempNetInterface = null;
    try {
        tempNetInterface = NetworkInterface.getNetworkInterfaces();
    } catch (SocketException ex) {
        ex.printStackTrace();
    }
    for (NetworkInterface iNet : new ArrayList<>(Collections.list(tempNetInterface))) {
        try {
            if (iNet.getHardwareAddress() != null) { //This verification might not 
                                             //be enought to find if a Interface is real.
                System.out.println(iNet.getDisplayName()); 
                if (iNet.getName().contains("wlan")) {
                    System.out.println("It is WIRELESS");
                } else {
                    System.out.println("It is NOT WIRELESS");
                }
            }
        } catch (SocketException ex) {
            ex.printStackTrace();
        }
    }
}    
}

我提到过查看名称/描述以确定该卡是否为无线卡。那个解决方案不合适。另外,正如我所说的,我不介意解决方案是否是特定于系统的——因此这就意味着JNI可以为每个系统提供不同的解决方案)。现在,你提到一个C函数,它得到了这个标志-那会是什么?我没有发现这样的东西。对不起,一定是看错了。。。你说得对。我也一直在找,还没找到任何东西。如果我看到某个C函数返回接口是否为无线接口,我将发布它。不知何故,我想这不会太难,因为iwconfig也能够区分。也许我们得看看那个。他用一种方法回答了这个问题。删除了您以前不同意的点。。。在几个系统上运行了几个测试之后,我发现Java代码一点也不可靠。通过java.net和sigar,我发现他们经常错过linux上的一些设备。这可能与linux管理设备的方式有关。然而,由于Linux似乎能够可靠地注册无线适配器,通过交叉引用/proc/net/wireless(来自Atmocreations的帖子)和ifconfig中的数据,我可以确定哪些适配器是无线的。Windows仍然在逃避我,因为我正在避免像VoidPointer建议的那样复杂的事情。
Intel(R) Centrino(R) Wireless-N 100
It is WIRELESS
Realtek PCIe GBE Family Controller
It is NOT WIRELESS