導航:首頁 > 知識科普 > 生成MAC的方法包括哪些

生成MAC的方法包括哪些

發布時間:2022-08-21 13:20:07

1. 如何通過C語言自動生成MAC地址

mac地址其實就是6個無符號的字元型數據,范圍在0~255

所以 生成6個unsigned char類型的隨機數就好。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain()
{
unsignedchara[6];
inti;
srand(time(NULL));
for(i=0;i<6;i++)
a[i]=rand()&0xFF;
for(i=0;i<5;i++)
printf("%02X:",a[i]);
printf("%02X ",a[i]);
return0;
}

2. 如何提高Mac運行速度 五大Mac提速方法

加速MAC:關閉自動運行的程序。

一、首先,輸入「系統首選項」中的「用戶和組」選項。

3. 網卡地址 MAC格式是什麼樣的

MAC(Media Access Control, 介質訪問控制)地址是識別LAN(區域網)節點的標識。網卡的物理地址通常是由網卡生產廠家燒入網卡的EPROM(一種快閃記憶體晶元,通常可以通過程序擦寫),它存儲的是傳輸數據時真正賴以標識發出數據的電腦和接收數據的主機的地址。

也就是說,在網路底層的物理傳輸過程中,是通過物理地址來識別主機的,它一般也是全球唯一的。比如,著名的乙太網卡,其物理地址是48bit(比特位)的整數,如:44-45-53-54-00-00,以機器可讀的方式存入主機介面中。乙太網地址管理機構(IEEE)將乙太網地址,也就是48比特的不同組合,分為若干獨立的連續地址組,生產乙太網網卡的廠家就購買其中一組,具體生產時,逐個將唯一地址賦予乙太網卡。

第一種方法使用Microsoft的Netbios API。 這是一套通過Winsock提供底層網路支持的命令。使用Netbios的最大缺點是您必須在系統中安裝了Netbios服務(如果您在windows網路中啟用了文件共享的話,這就不是問題了)。除此此外,這種方法又快又准確。

Netbios API只包括了一個函數,就叫做Netbios。這個函數使用網路控制塊(network control block)結構作為參數,這個結構告訴函數要做什麼。結構的定義如下:
typedef struct _NCB {
UCHAR ncb_command;
UCHAR ncb_retcode;
UCHAR ncb_lsn;
UCHAR ncb_num;
PUCHAR ncb_buffer;
WORD ncb_length;
UCHAR ncb_callname[NCBNAMSZ];
UCHAR ncb_name[NCBNAMSZ];
UCHAR ncb_rto;
UCHAR ncb_sto;
void (CALLBACK *ncb_post) (struct _NCB *);
UCHAR ncb_lana_num;
UCHAR ncb_cmd_cplt;
#ifdef _WIN64
UCHAR ncb_reserve[18];
#else
UCHAR ncb_reserve[10];
#endif
HANDLE ncb_event;
} NCB, *PNCB;

重點在於ncb_command 成員。這個成員告訴Netbios該作什麼。我們使用三個命令來探測MAC地址。他們在MSDN的定義如下:
命令描述:
NCBENUM Windows NT/2000: 列舉系統中網卡的數量。使用此命令後,ncb_buffer成員指向由LANA_ENUM結構填充的緩沖區。
NCBENUM 不是標準的 NetBIOS 3.0 命令。

NCBRESET 重置網卡。網卡在接受新的NCB命令之前必須重置。
NCBASTAT 接受本地或遠程介面卡的狀態。使用此命令後,ncb_buffer成員指向由ADAPTER_STATUS結構填充的緩沖區,隨後是NAME_BUFFER結構的數組。

下面就是取得您系統MAC地址的步驟:
1》列舉所有的介面卡。
2》重置每塊卡以取得它的正確信息。
3》查詢介面卡,取得MAC地址並生成標準的冒號分隔格式。

下面就是實例源程序。
netbios.cpp

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;
#define bzero(thing,sz) memset(thing,0,sz)

bool GetAdapterInfo(int adapter_num, string &mac_addr)
{
// 重置網卡,以便我們可以查詢
NCB Ncb;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = adapter_num;
if (Netbios(&Ncb) != NRC_GOODRET) {
mac_addr = "bad (NCBRESET): ";
mac_addr += string(Ncb.ncb_retcode);
return false;
}

// 准備取得介面卡的狀態塊
bzero(&Ncb,sizeof(Ncb);
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = adapter_num;
strcpy((char *) Ncb.ncb_callname, "*");
struct ASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} Adapter;
bzero(&Adapter,sizeof(Adapter));
Ncb.ncb_buffer = (unsigned char *)&Adapter;
Ncb.ncb_length = sizeof(Adapter);

// 取得網卡的信息,並且如果網卡正常工作的話,返回標準的冒號分隔格式。
if (Netbios(&Ncb) == 0)
{
char acMAC[18];
sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
int (Adapter.adapt.adapter_address[0]),
int (Adapter.adapt.adapter_address[1]),
int (Adapter.adapt.adapter_address[2]),
int (Adapter.adapt.adapter_address[3]),
int (Adapter.adapt.adapter_address[4]),
int (Adapter.adapt.adapter_address[5]));
mac_addr = acMAC;
return true;
}
else
{
mac_addr = "bad (NCBASTAT): ";
mac_addr += string(Ncb.ncb_retcode);
return false;
}
}

int main()
{
// 取得網卡列表
LANA_ENUM AdapterList;
NCB Ncb;
memset(&Ncb, 0, sizeof(NCB));
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (unsigned char *)&AdapterList;
Ncb.ncb_length = sizeof(AdapterList);
Netbios(&Ncb);

// 取得本地乙太網卡的地址
string mac_addr;
for (int i = 0; i < AdapterList.length - 1; ++i)
{
if (GetAdapterInfo(AdapterList.lana[i], mac_addr))
{
cout << "Adapter " << int (AdapterList.lana[i]) <<
"'s MAC is " << mac_addr << endl;
}
else
{
cerr << "Failed to get MAC address! Do you" << endl;
cerr << "have the NetBIOS protocol installed?" << endl;
break;
}
}

return 0;
}

file://---------------------------------------------------------------------------

第二種方法-使用COM GUID API
這種方法使用COM API創建一個GUID(全局唯一標識符)並從那裡繼承MAC地址。GUID通常用來標識COM組件以及系統中的其他對象。它們是由MAC地址(結合其他東西)計算得來的,表面上MAC地址就包含在其中。我說表面上是因為事實上並沒有包含。
我提供這種方法更多的是為了作為反面教材。您也許用這種方法能夠得到MAC地址,但有時候您只會得到隨機的十六進制數值。
下面的例子十分簡單,無需多講。我們使用CoCreateGuid創建GUID,並將最後六個位元組放入字元串中。它們可能是MAC地址,但並不是必然的。

uuid.cpp
#include <windows.h>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
cout << "MAC address is: ";

// 向COM要求一個UUID。如果機器中有乙太網卡,
// UUID最後的六個位元組(Data4的2-7位元組)應該是本地乙太網卡的MAC地址。
GUID uuid;
CoCreateGuid(&uuid);
// Spit the address out
char mac_addr[18];
sprintf(mac_addr,"%02X:%02X:%02X:%02X:%02X:%02X",
uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],
uuid.Data4[5],uuid.Data4[6],uuid.Data4[7]);
cout << mac_addr << endl;
getch();
return 0;
}

第三種方法- 使用SNMP擴展API
我要討論的第三種方法是使用Windows的SNMP(簡單網路管理協議)擴展來取得MAC地址。在我的經驗里,這個協議很簡單。代碼也是直勾勾的向前的。基本步驟和Netbios相同:
1》取得網卡列表
2》查詢每塊卡的類型和MAC地址
3》保存當前網卡
我個人對SNMP了解不多,但如我剛剛所言,代碼十分清楚。

snmp.cpp
#include <snmp.h>
#include <conio.h>
#include <stdio.h>

typedef bool(WINAPI * pSnmpExtensionInit) (
IN DWORD dwTimeZeroReference,
OUT HANDLE * hPollForTrapEvent,
OUT AsnObjectIdentifier * supportedView);

typedef bool(WINAPI * pSnmpExtensionTrap) (
OUT AsnObjectIdentifier * enterprise,
OUT AsnInteger * genericTrap,
OUT AsnInteger * specificTrap,
OUT AsnTimeticks * timeStamp,
OUT RFC1157VarBindList * variableBindings);

typedef bool(WINAPI * pSnmpExtensionQuery) (
IN BYTE requestType,
IN OUT RFC1157VarBindList * variableBindings,
OUT AsnInteger * errorStatus,
OUT AsnInteger * errorIndex);

typedef bool(WINAPI * pSnmpExtensionInitEx) (
OUT AsnObjectIdentifier * supportedView);

void main()
{
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionInitEx m_InitEx;
pSnmpExtensionQuery m_Query;
pSnmpExtensionTrap m_Trap;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};
UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};
UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};
AsnObjectIdentifier MIB_ifMACEntAddr =
{ sizeof(OID_ipMACEntAddr) sizeof(UINT), OID_ipMACEntAddr };
AsnObjectIdentifier MIB_ifEntryType =
{sizeof(OID_ifEntryType) sizeof(UINT), OID_ifEntryType};
AsnObjectIdentifier MIB_ifEntryNum =
{sizeof(OID_ifEntryNum) sizeof(UINT), OID_ifEntryNum};
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = {0, 0};
int ret;
int dtmp;
int i = 0, j = 0;
bool found = false;
char TempEthernet[13];
m_Init = NULL;
m_InitEx = NULL;
m_Query = NULL;
m_Trap = NULL;

/* 載入SNMP DLL並取得實例句柄 */
m_hInst = LoadLibrary("inetmib1.dll");
if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)
{
m_hInst = NULL;
return;
}
m_Init =
(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_InitEx =
(pSnmpExtensionInitEx) GetProcAddress(m_hInst,
"SnmpExtensionInitEx");
m_Query =
(pSnmpExtensionQuery) GetProcAddress(m_hInst,
"SnmpExtensionQuery");
m_Trap =
(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);

/* 初始化用來接收m_Query查詢結果的變數列表 */
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL;

/* 在OID中拷貝並查找介面表中的入口數量 */
varBindList.len = 1; /* Only retrieving one item */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
printf("# of adapters in this system : %in",
varBind[0].value.asnValue.number);
varBindList.len = 2;

/* 拷貝OID的ifType-介面類型 */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);

/* 拷貝OID的ifPhysAddress-物理地址 */
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);

do
{

/* 提交查詢,結果將載入 varBindList。
可以預料這個循環調用的次數和系統中的介面卡數量相等 */
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
if (!ret)
ret = 1;
else
/* 確認正確的返回類型 */
ret =
SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
MIB_ifEntryType.idLength); if (!ret) {
j++;
dtmp = varBind[0].value.asnValue.number;
printf("Interface #%i type : %in", j, dtmp);

/* Type 6 describes ethernet interfaces */
if (dtmp == 6)
{

/* 確認我們已經在此取得地址 */
ret =
SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
MIB_ifMACEntAddr.idLength);
if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))
{
if((varBind[1].value.asnValue.address.stream[0] == 0x44)
&& (varBind[1].value.asnValue.address.stream[1] == 0x45)
&& (varBind[1].value.asnValue.address.stream[2] == 0x53)
&& (varBind[1].value.asnValue.address.stream[3] == 0x54)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00))
{
/* 忽略所有的撥號網路介面卡 */
printf("Interface #%i is a DUN adaptern", j);
continue;
}
if ((varBind[1].value.asnValue.address.stream[0] == 0x00)
&& (varBind[1].value.asnValue.address.stream[1] == 0x00)
&& (varBind[1].value.asnValue.address.stream[2] == 0x00)
&& (varBind[1].value.asnValue.address.stream[3] == 0x00)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00)
&& (varBind[1].value.asnValue.address.stream[5] == 0x00))
{
/* 忽略由其他的網路介面卡返回的NULL地址 */
printf("Interface #%i is a NULL addressn", j);
continue;
}
sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
printf("MAC Address of interface #%i: %sn", j,
TempEthernet);}
}
}
} while (!ret); /* 發生錯誤終止。 */
getch();

FreeLibrary(m_hInst);
/* 解除綁定 */
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
}

4. 交換機是如何建立起它的MAC地址表的

我在華為3COM論壇也看到同樣的問題,下面是我在華為3COM論壇的回復:會發送廣播,工作原理就和HUB一樣了,我們可以先來了解一下交換機MAC地址表的建立過程。當交換機剛加電的時候,MAC地址表是沒有內容的,主機之間誰也不知道誰的MAC地址,當主機A要和主機B通訊時,首先會發送一個ARP廣播,想知道B的MAC地址,交換機收到該廣播包,把主機A的MAC對應到MAC地址表裡,與進入得埠匹配起來,然後轉發該廣播,主機B響應此廣播包告訴主機A自己的MAC地址,交換機也同樣紀錄B的MAC地址與進入埠對應起來,這就是MAC地址表的建立過程,現在如果把MAC地址學習功能去掉的話,就只能在交換機里轉發廣播了!

5. FPGA開發乙太網時的mac是怎麼生成的隨便編一個都可以嗎

隨便設置,網線直連的話,只要跟電腦不一樣就行,如果多台設備通過交換機互連,則都設置不一樣就行。

6. 網卡MAC怎麼修改

1.修改網卡的MAC 地址一般操作步驟
計算機——屬性——設備管理器——網路設備器——網卡——屬性---高級--network address值

2 如果用戶發現沒有管理本地MAC地址怎麼辦。
可以通過修改注冊表來添加這個MAC地址鍵值 這個上網搜,有很多很詳細介紹
3.W7的特別處
在WINDOW7 下面MAC 地址不能隨機生成MAC 地址,修改時要注意如下規則:
從左往右第二個字元必須2,6,A,E其中之一,
列如:
02:00:00:00:00:00 ---有效
06:00:00:00:00:00 ---有效
0A:00:00:00:00:00 ---有效
0E:00:00:00:00:00 ---有效
不知道是不是WIN7 的一個BUG 還是什麼
我自己發現第二個字元是零也可以

7. 我想請教WinXP下怎麼更改其MAC地址。MAC地址的號碼又是依據什麼生成的

大家都知道MAC地址是網卡的物理地址,是固化在網卡的晶元里的,正常情況下應該是唯一的。但是我們可以利用一些方法進行修改MAC地址來「欺騙」接入設備。

操作系統法修改MAC地址

首先,要求計算機的操作系統是Windows 2000或者Windows XP。接著,在其他的計算機上,查出該計算機的MAC地址。使用ipconfig /all命令即可看到Physical Address行對應的一個類似xx-xx-xx-xx-xx-xx的值,將該值記錄下來。

接下來,在另外一台您希望修改MAC地址的計算機上右鍵點擊「我的電腦」圖標,選擇「屬性」,在彈出的窗體中選擇「硬體」標簽頁,再選擇「設備管理器」按鈕。

在彈出的設備管理窗口中選中您的網卡後雙擊。在彈出的網卡屬性窗口中選擇「高級」標簽頁。在屬性列表中選擇「Network Address」,

選中右側的「值」前的單選框。在裡面輸入您紀錄的MAC值,注意輸入的時候數值間不用空格,也不用輸入「-」號。

現在您可以用ipconfig/all看看,這台機器的MAC地址,已經改成了您輸入的值了。

注冊表法修改MAC地址

Windows 9x/ME:

選擇運行,在運行命令行中鍵入「regedit」,打開注冊表編輯器,然後找到HKEY_LOCAL_MACHINE\ system\Currentcontrolset\services\classes\net這個目錄。在這一級目錄下會有000、001、002等多個子目錄,觀察DriverDesc中的內容描述,確定當前選項是所修改的是網卡的描述。

然後在其下添一個子鍵,名字為NetworkAddress,值設為所需要的MAC地址,再用winipcfg查看,MAC地址已經更改了。

Windows 2K:

打開注冊表編輯器,找到「HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E972-E325-11CE-BFC1-08002BE10318}」這個目錄,在這個目錄下有0000、0001、0002等主鍵,查找DriverDesc內容為您要修改的網卡的描述相吻合的主鍵,

在此主鍵下,添一個字元串,名字為「NetworkAddress」,把它的值設為您要的MAC地址,要連續寫如「001010101010」。然後到主鍵下「NDIparams」中添加一項「NetworkAddress」的主鍵值,在該主鍵下添加名為「default」的字元串,值寫要設的MAC地址,要連續寫,如「001010101010」。

在「NetworkAddress」的主鍵下繼續添加名為「ParamDesc」的字元串,其作用為指定「NetworkAddress」主鍵的描述,其值可為可以隨意設置。這樣重新啟動一次以後打開網路鄰居的屬性,雙擊相應網卡項會發現有一個高級設置,其下存在MAC Address 的選項,這就是您在第二步里在注冊表中加的新項「NetworkAddress」,以後只要在此修改MAC地址就可以了。關閉注冊表編輯器,重新啟動,您的網卡地址已經改好了。

8. 為什麼我用ansys MAGNiTUDE生成的許可證MAC地址總是無線網卡的地址怎麼生成成物理網卡的MAC地址啊

你好,你需要在「更改適配器設置」中把無線網路禁用,然後再生成License.dat文件,這時候License.dat裡面的MAC地址就不會是無線網路的MAC地址了,還有就是你可以手動更改license.dat文件里的MAC地址呀。。。

閱讀全文

與生成MAC的方法包括哪些相關的資料

熱點內容
怎麼去除積雪的方法 瀏覽:59
機器人編隊控制方法研究 瀏覽:525
小孩快速降溫的方法 瀏覽:519
三步折帽子方法簡單又好看 瀏覽:448
骨密度計算方法公式骨礦骨面積 瀏覽:827
什麼方法能讓竹子的根死亡 瀏覽:195
熱天豬掉料的解決方法 瀏覽:486
紅米2指紋在哪裡設置方法 瀏覽:122
戴胸罩的正確方法視頻 瀏覽:469
尾氣不達標檢測方法 瀏覽:149
帶讀屬於什麼方法 瀏覽:427
早產兒體重快速增長的方法 瀏覽:308
最佳懷孕姿勢和方法 瀏覽:281
清明疊金元寶的簡單方法 瀏覽:372
四胞胎記憶方法視頻 瀏覽:463
煤氣口漏氣怎麼處理方法 瀏覽:998
數字萬用表交流電壓測量方法步驟 瀏覽:657
後臉部按摩儀使用方法 瀏覽:452
決策分析方法練習題 瀏覽:258
簡單擦眼霜的正確使用方法圖 瀏覽:28