【发布时间】:2021-07-18 12:58:07
【问题描述】:
无论操作系统如何,我都需要一个代码来获取计算机特定的字符串/代码。它看起来像下面的代码,我的意思是 getCPU() 给出不同的结果。我不明白为什么,我错在哪里?
我注意到的问题:
- 显然在重新安装后结果会发生变化
- 在极少数情况下,即使不重新安装,结果也会发生变化
问题出在哪里?
#include <net/if_dl.h>
#include <net/if_types.h>
#include <ifaddrs.h>
#include <mach-o/arch.h>
unsigned short hashMacAddress( unsigned char* mac ) {
unsigned short hash = 0;
for ( unsigned int i = 0; i < 6; i++ )
{
hash += ( mac[i] << (( i & 1 ) * 8 ));
}
return hash;
}
char *getMacHash() {
char* ret = new char[255];
unsigned short mac1=0;
unsigned short mac2=0;
bool foundMac1 = false;
struct ifaddrs* ifaphead;
if ( getifaddrs( &ifaphead ) != 0 )
return ret;
struct ifaddrs* ifap;
for ( ifap = ifaphead; ifap; ifap = ifap->ifa_next )
{
struct sockaddr_dl* sdl = (struct sockaddr_dl*)ifap->ifa_addr;
if ( sdl && ( sdl->sdl_family == AF_LINK ) && ( sdl->sdl_type == IFT_ETHER ))
{
if ( !foundMac1 )
{
foundMac1 = true;
mac1 = hashMacAddress( (unsigned char*)(LLADDR(sdl))); //sdl->sdl_data) + sdl->sdl_nlen) );
} else {
mac2 = hashMacAddress( (unsigned char*)(LLADDR(sdl))); //sdl->sdl_data) + sdl->sdl_nlen) );
break;
}
}
}
freeifaddrs( ifaphead );
sprintf(ret, "S_%d%d", mac1, mac2);
return ret;
}
#include <mach-o/arch.h>
unsigned short getCpuHash() {
const NXArchInfo* info = NXGetLocalArchInfo();
unsigned short val = 0;
val += (unsigned short)info->cputype;
val += (unsigned short)info->cpusubtype;
return val;
}
char *getCPU() {
char* ret = new char[255];
unsigned short cpu;
cpu=getCpuHash();
if (cpu>118)
sprintf(ret, "%dX%s", getCpuHash(), getMacHash());
else
sprintf(ret, "%dx%s", getCpuHash(), getMacHash());
strcpy(ret,cleanChars(ret));
if (strlen(ret)>50) {
char tmp[50];
strncpy(tmp, ret, 50);
strcpy(ret, tmp);
}
return cleanChars(ret);
} ```
【问题讨论】:
-
您到底想识别什么?你对“同一台机器”的标准是什么?
-
你不会得到那个代码:用几个段落解释我们如何在没有任何操作系统的情况下编译然后运行 C 代码,以及如何在没有任何操作系统的情况下进行 TCP/IP 传输。
-
另外,如果您将新的以太网控制器添加到计算机会发生什么?其中一些花费几十欧元或美元....