关于IP的问题

sghcpt 2011-01-11 10:15:49
我想修改本地的IP地址,主要是读注册表信息,在注册表的Interfaces键哪里列出了网卡的信息,我的程序主要是读这些信息后比较的。我的电脑安装了两张网卡,在Interfaces下,有一个键{AC5D7DCE-FC74-422A-A3E0-8B46F67FD048}值和一个{D67AB0F7-1EG3-4073-ADF5-9923FEDB7632},最后一个是正常描述一张网卡信息的,它里面的信息有IP地址,如192.168.26.3。前面的键,不知道怎么会出现的,它只是描述了一些信息,但它也有192.168.26.3和子网的值,但相比较后面的键{D67AB0F7-1EG3-4073-ADF5-9923FEDB7632}描述的信息少了很多。现在我的问题是,因为我的程序是传进一个IP地址,然后跟Interfaces键下的值比较,主要是比较IP地址,因为{AC5D7DCE-FC74-422A-A3E0-8B46F67FD048}比{D67AB0F7-1EG3-4073-ADF5-9923FEDB7632},先比较,所以程序返回的是{AC5D7DCE-FC74-422A-A3E0-8B46F67FD048}的信息,但实际的网卡的信息应该是{D67AB0F7-1EG3-4073-ADF5-9923FEDB7632}下的信息,我想请问,在Interfaces下的这些键信息,那些描述网卡的信息是固定的,也就是我应该拿什么去判断,才可以找到我想要的网卡信息,如{D67AB0F7-1EG3-4073-ADF5-9923FEDB7632}。
...全文
163 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sghcpt 2011-01-11
  • 打赏
  • 举报
回复
To qiri07
多谢你的回答,但好像偏离了主题了,我不是想问那个,我只是问我上面的问题。
qiri07 2011-01-11
  • 打赏
  • 举报
回复
一般MAC地址在网卡中是固定的,当然也有网络高手会想办法去修改自己的MAC地址。
修改自己的MAC地址有两种方法,一种是硬件修改,另外一种是软件修改。硬件的方法就是直接对
网卡进行操作,修改保存在网卡的EPROM里面的MAC地址,通过网卡生产厂家提供的修改程序可以
更改存储器里的地址。那么什么叫做EPROM呢?EPROM是电子学中一种存储器的专业术语,
它是可擦写的,也就是说一张白纸你用钢笔写了一遍以后就不能再用橡皮擦去了,而EPROM这张
白纸用铅笔写后可以再擦去,可以反复改变其中数据的存储器。当然软件修改的方法就相对来说
要简单得多了,在Windows中,网卡的MAC保存在注册表中,实际使用也是从注册表中提取的,
所以只要修改注册表就可以改变MAC。Windows 9x中修改:打开注册表编辑器,在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSetService\Class\Net\下的0000,0001,0002。

Windows 2000/XP中的修改:同样打开注册表编辑器,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
4D36E970-E325-11CE-BFC1-08002BE10318 中的0000,0001,0002中的DriverDesc,
如果在0000找到,就在0000下面添加字符串变量,命名为“NetworkAddress”,
值为要设置的MAC地址,例如:000102030405

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
{4D36E972-E325-11CE-BFC1-08002bE10318}\0001
(每台电脑上的class 后面的项不同的 看自己的网卡 是什么然后再加 硬件属性里面可以看到自己的网卡是什么型号的 右击我的电脑 管理 设备管理 网卡)
完成上述操作后重启就好了。一般网卡发出的包的源MAC地址并不是网卡本身写上去的,
而是应用程序提供的,只是在通常的实现中,应用程序先从网卡上得到MAC地址,
每次发送的时候都用这个MAC作为源MAC而已,而注册表中的MAC地址是在Windows安装的时候
从网卡中读入的,只要你的操作系统不重新安装应该问题不大。
sghcpt 2011-01-11
  • 打赏
  • 举报
回复
To VisualEleven
请问,你上面的代码是得到IP的信息,但我现在是在程序传进一个IP地址,然后比较Interfaces哪里,那个符合,然后得到Ip的信息或者设置别的IP,我出现上面的问题,请问,应该怎么判断才对了?
Eleven 2011-01-11
  • 打赏
  • 举报
回复
GetAdaptersAddresses()
The GetAdaptersAddresses function retrieves the addresses associated with the adapters on the local computer.

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdlib.h>

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */

int __cdecl main(int argc, char **argv)
{

/* Declare and initialize variables */

DWORD dwSize = 0;
DWORD dwRetVal = 0;

int i = 0;

// Set the flags to pass to GetAdaptersAddresses
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;

// default to unspecified address family (both)
ULONG family = AF_UNSPEC;

LPVOID lpMsgBuf = NULL;

PIP_ADAPTER_ADDRESSES pAddresses = NULL;
ULONG outBufLen = 0;

PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
IP_ADAPTER_PREFIX *pPrefix = NULL;

if (argc != 2) {
printf(" Usage: getadapteraddresses family\n");
printf(" getadapteraddresses 4 (for IPv4)\n");
printf(" getadapteraddresses 6 (for IPv6)\n");
printf(" getadapteraddresses A (for both IPv4 and IPv6)\n");
exit(1);
}

if (atoi(argv[1]) == 4)
family = AF_INET;
else if (atoi(argv[1]) == 6)
family = AF_INET6;

outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);

// Make an initial call to GetAdaptersAddresses to get the
// size needed into the outBufLen variable
if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen)
== ERROR_BUFFER_OVERFLOW) {
FREE(pAddresses);
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
}

if (pAddresses == NULL) {
printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
exit(1);
}
// Make a second call to GetAdapters Addresses to get the
// actual data we want
printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen);
printf("Calling GetAdaptersAddresses function with family = ");
if (family == AF_INET)
printf("AF_INET\n");
if (family == AF_INET6)
printf("AF_INET6\n");
if (family == AF_UNSPEC)
printf("AF_UNSPEC\n\n");

dwRetVal =
GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

if (dwRetVal == NO_ERROR) {
// If successful, output some information from the data we received
pCurrAddresses = pAddresses;
while (pCurrAddresses) {
printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
pCurrAddresses->Length);
printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);

pUnicast = pCurrAddresses->FirstUnicastAddress;
if (pUnicast != NULL) {
for (i = 0; pUnicast != NULL; i++)
pUnicast = pUnicast->Next;
printf("\tNumber of Unicast Addresses: %d\n", i);
} else
printf("\tNo Unicast Addresses\n");

pAnycast = pCurrAddresses->FirstAnycastAddress;
if (pAnycast) {
for (i = 0; pUnicast != NULL; i++)
pAnycast = pAnycast->Next;
printf("\tNumber of Anycast Addresses: %d\n", i);
} else
printf("\tNo Anycast Addresses\n");

pMulticast = pCurrAddresses->FirstMulticastAddress;
if (pMulticast) {
for (i = 0; pMulticast != NULL; i++)
pMulticast = pMulticast->Next;
printf("\tNumber of Multicast Addresses: %d\n", i);
} else
printf("\tNo Multicast Addresses\n");

pDnServer = pCurrAddresses->FirstDnsServerAddress;
if (pDnServer) {
for (i = 0; pDnServer != NULL; i++)
pDnServer = pDnServer->Next;
printf("\tNumber of DNS Server Addresses: %d\n", i);
} else
printf("\tNo DNS Server Addresses\n");

printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
printf("\tDescription: %wS\n", pCurrAddresses->Description);
printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName);

if (pCurrAddresses->PhysicalAddressLength != 0) {
printf("\tPhysical address: ");
for (i = 0; i < (int) pCurrAddresses->PhysicalAddressLength;
i++) {
if (i == (pCurrAddresses->PhysicalAddressLength - 1))
printf("%.2X\n",
(int) pCurrAddresses->PhysicalAddress[i]);
else
printf("%.2X-",
(int) pCurrAddresses->PhysicalAddress[i]);
}
}
printf("\tFlags: %ld\n", pCurrAddresses->Flags);
printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
printf("\tIfType: %ld\n", pCurrAddresses->IfType);
printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
printf("\tIpv6IfIndex (IPv6 interface): %u\n",
pCurrAddresses->Ipv6IfIndex);
printf("\tZoneIndices (hex): ");
for (i = 0; i < 16; i++)
printf("%lx ", pCurrAddresses->ZoneIndices[i]);
printf("\n");

pPrefix = pCurrAddresses->FirstPrefix;
if (pPrefix) {
for (i = 0; pPrefix != NULL; i++)
pPrefix = pPrefix->Next;
printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
} else
printf("\tNo IP Adapter Prefix entries\n");

printf("\n");

pCurrAddresses = pCurrAddresses->Next;
}
} else {
printf("Call to GetAdaptersAddresses failed with error: %d\n",
dwRetVal);
if (dwRetVal == ERROR_NO_DATA)
printf("\tNo addresses were found for the requested parameters\n");
else {

if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) & lpMsgBuf, 0, NULL)) {
printf("\tError: %s", lpMsgBuf);
LocalFree(lpMsgBuf);
FREE(pAddresses);
exit(1);
}
}
}
FREE(pAddresses);
return 0;
}
sghcpt 2011-01-11
  • 打赏
  • 举报
回复
请问qiri07
在注册表Interfaces键下的子键中,那个是表示mac地址的?
qiri07 2011-01-11
  • 打赏
  • 举报
回复
两张网卡,可以根据网卡的MAC地址区分,因为是唯一的
sunshine716 2011-01-11
  • 打赏
  • 举报
回复
帮顶
oyljerry 2011-01-11
  • 打赏
  • 举报
回复
那就查看一下两个Interface之间注册表键值有一些什么其他的区别,然后提取出来作为判断条件

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧