java取主机的网卡物理地址

1.用jdk的java.net.NetworkInterface接口

package com.tc.temp;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class Network {
    public static void main(String[] args) throws Exception {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while(networkInterfaces.hasMoreElements()) {
            NetworkInterface interface1 = networkInterfaces.nextElement();
            if (interface1.getParent() == null && interface1.getInetAddresses() != null && interface1.getHardwareAddress() != null){
                Enumeration<InetAddress> inetAddrs = interface1.getInetAddresses();
                System.out.print("网卡名称:");
                System.out.println(interface1.getName() + " " + interface1.getDisplayName());
                
                System.out.print("MAC:");
                byte[] btMac = interface1.getHardwareAddress();
                for (int i = 0; i < btMac.length; i++) {
                    System.out.print(Integer.toHexString(btMac[i] & 0xff).toUpperCase());
                    if(i < btMac.length - 1) System.out.print(":");
                }
                System.out.println();
                
                System.out.println("网卡IP:");
                while (inetAddrs.hasMoreElements())
                    System.out.println(inetAddrs.nextElement());
                System.out.println();
                System.out.println();
            }
        }
    }
}

2.用jni

window

#include "stdafx.h"
#include "com_cndatacom_cdc_SystemLicense.h"
#include "jni.h"
#include "windows.h"
#include "dos.h"
#include <wbemidl.h>
#pragma comment(lib,"wbemuuid.lib")
#include <tchar.h>

struct LinkedNode{
    unsigned short *val;
    size_t len;
    LinkedNode *next;
};

size_t wslength(wchar_t *ws) {
    size_t i = 0;
    while (*(ws + i) != '\0')
        i++;
    return i;
}

void wscat(wchar_t *ws1, wchar_t *ws2, unsigned short *ls) {
    wchar_t wc = '\0';
    size_t i = 0;
    while ((wc = *(ws1 + i)) != '\0') {
        *(ls + i) = wc;
        i++;
    }
    size_t j = 0;
    while ((wc = *(ws2 + j)) != '\0') {
        *(ls + i + j) = wc;
        j++;
    }
}

JNIEXPORT jobjectArray JNICALL Java_com_cndatacom_cdc_SystemLicense_getMachineInfo
  (JNIEnv * jniEnv_, jclass jc) {

      
    IWbemLocator *locator = NULL;
    IWbemServices *services = NULL;
    IEnumWbemClassObject *pEnumerator = NULL;

    BSTR resource = SysAllocString(L"ROOT\\CIMV2");
    BSTR language = SysAllocString(L"WQL");
    //Caption, Description, MACAddress, ServiceName, DNSHostName
    BSTR query =
            SysAllocString(
                    L"SELECT MACAddress FROM Win32_NetworkAdapterConfiguration where IPEnabled = true");

    HRESULT hr = 0;
    hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &locator);
    hr = locator->ConnectServer(resource, NULL, NULL, 0, NULL, 0, 0, &services);
    hr = services->ExecQuery(language, query, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);

    struct LinkedNode *first = NULL;
    struct LinkedNode *point = NULL;
    size_t allleng = 0;

    if (pEnumerator != NULL) {
        IWbemClassObject *result = NULL;
        ULONG uCount = 1, uReturned;
        //printf("获取IEnumWbemClassObject成功!\n");
        int iEnumIdx = 0;
        const wchar_t *str = NULL;
        while ((hr = pEnumerator->Next(WBEM_INFINITE, uCount, &result, &uReturned)) == S_OK) {
            SAFEARRAY *pvNames = NULL;
            if (result->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) {
                //printf("获取名称成功!\n");
                long vbl, vbu;
                SafeArrayGetLBound(pvNames, 1, &vbl);
                SafeArrayGetUBound(pvNames, 1, &vbu);

                for (long idx = vbl; idx <= vbu; idx++) {
                    //printf("遍历名称列表!\n");
                    long aidx = idx;
                    wchar_t *wsName = 0;
                    VARIANT vValue;
                    VariantInit(&vValue);
                    SafeArrayGetElement(pvNames, &aidx, &wsName);

                    BSTR bs = SysAllocString(wsName);
                    HRESULT hRes = result->Get(bs, 0, &vValue, NULL, 0);
                    SysFreeString(bs);
                    if (hRes == S_OK) {
                        if (vValue.vt == VT_BSTR) {
                            //int len = wslength(wsName) + wslength(vValue.bstrVal);
                            int len = wslength(vValue.bstrVal);
                            unsigned short *ls = (unsigned short *) calloc(len, 16);
                            wchar_t *t = L"";
                            wscat(t, vValue.bstrVal, ls);
                            struct LinkedNode *nw;
                            nw = (LinkedNode*)calloc(1, sizeof(LinkedNode));
                            
                            nw->len = len;
                            nw->next = NULL;
                            nw->val = ls;
                            if (point != NULL)
                                point->next = nw;
                            point = nw;
                            if (first == NULL)
                                first = point;
                            allleng ++;
                        }
                    }
                    VariantClear(&vValue);
                    SysFreeString(wsName);
                }
            }
            result->Release();
            if (pvNames)
                SafeArrayDestroy(pvNames);
            iEnumIdx++;
        }
    }


    pEnumerator->Release();
    locator->Release();
    services->Release();
    
    jobjectArray _array = jniEnv_->NewObjectArray(allleng, jniEnv_->FindClass("[C"), NULL);
    point = first;
    int x = 0;
    while(true) {
        jcharArray _longArray = jniEnv_->NewCharArray(point->len);
        jniEnv_->SetCharArrayRegion(_longArray, 0, point->len, point->val);
        jniEnv_->SetObjectArrayElement(_array, x, _longArray);
        x ++;
        LinkedNode *tmp = point;
        point = point->next;
        free(tmp);
        if (x >= allleng)
            break;
    }


    return _array;
}

linux

/*
 * com_cndatacom_cdc_SystemLicense.cpp
 *
 *  Created on: 2012-11-30
 *      Author: root
 */
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <malloc.h>
#include "com_cndatacom_cdc_SystemLicense.h"

const char hexChar[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

void char2Hex(char i, char str[]) {
    *str = hexChar[(i & 255) >> 16];
    *(str + 1) = hexChar[i & 15];
}


JNIEXPORT jobjectArray JNICALL Java_com_cndatacom_cdc_SystemLicense_getMachineInfo(
        JNIEnv * _jniEnv, jclass _jclzz) {

    int sockfd, i;
    struct ifreq buffer;

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd <= 0) {
        fputs("Can not create socket!\n", stderr);
        return NULL;
    }

    memset(&buffer, 0, sizeof(struct ifreq));
    strcpy(buffer.ifr_name, "eth0");
    ioctl(sockfd, SIOCGIFHWADDR, &buffer);
    close(sockfd);

    jchar mac[17];

    for (i = 0; i < 6; i++) {
        char item[2];
        char2Hex(buffer.ifr_hwaddr.sa_data[i] & 0xff, item);
        mac[i * 3] = item[0];
        mac[i * 3 + 1] = item[1];
        if(i != 5) mac[i * 3 + 2] = ':';
    }

    jobjectArray _array = _jniEnv->NewObjectArray(1, _jniEnv->FindClass("[C"), NULL);

    jcharArray _longArray = _jniEnv->NewCharArray(17);
    _jniEnv->SetCharArrayRegion(_longArray, 0, 17, mac);
    _jniEnv->SetObjectArrayElement(_array, 0, _longArray);
    return _array;
}

转载于:https://www.cnblogs.com/hujz/archive/2013/03/14/2959458.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Linux中,可以使用ifconfig命令来查看网卡物理地址。ifconfig命令显示了网络接口的配置信息,包括IP地址、子网掩码和物理地址等。\[2\]要查看网卡物理地址,可以在终端中输入ifconfig命令,然后找到对应的网卡接口,物理地址通常显示在"HWaddr"或"ether"字段后面。\[2\]另外,如果需要修改网卡物理地址,可以编辑网络配置文件,如/etc/nf(Archlinux)或/etc/conf.d/net(Gentoo),在对应的网卡配置字符串中添加"hw ether"后跟着新的物理地址。\[3\]这样可以临时修改网卡物理地址,而不实际改动网卡的真实属性。 #### 引用[.reference_title] - *1* *3* [Linux修改 网卡物理地址(Mac Address)](https://blog.csdn.net/weixin_30851655/article/details/116819433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址)](https://blog.csdn.net/m0_54849806/article/details/126424619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值