成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux下獲取CPUID、硬盤序列號與MAC地址

運維 系統運維
在很多系統軟件的開發中,需要使用一些系統的唯一性信息。所以,得到主機的CPUID、硬盤序列號及網卡的MAC地址,就成個一件很重要的應用。

在很多系統軟件的開發中,需要使用一些系統的唯一性信息。所以,得到主機的CPUID、硬盤序列號及網卡的MAC地址,就成個一件很重要的應用。

本人經過一番google即自己的鉆研,基本上實現了這幾個功能。需要的準備知識有:

GCC的嵌入匯編,具體的GCC嵌入匯編知識,請參考相關手冊

ioctl系統調用,具體的調用方法,請查看手冊頁

獲取CPUID

按照網上提供的說明,CPUID并不是所有的Intel CPU都支持的。如果支持,匯編調用為:eax置0000_0003,調用cpuid。

以下為實現代碼(在我的CPU上,并沒有得到):

#define cpuid(in,a,b,c,d) asm("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in));

static int

getcpuid (char *id, size_t max)

{

int i;

unsigned long li, maxi, maxei, ebx, ecx, edx, unused;

cpuid (0, maxi, unused, unused, unused);

maxi &= 0xffff;

if (maxi < 3)

{

return -1;

}

cpuid (3, eax, ebx, ecx, edx);

snprintf (id, max, "%08lx %08lx %08lx %08lx", eax, ebx, ecx, edx);

fprintf (stdout, "get cpu id: %s\n", id);

return 0;

}

獲取硬盤序列號

這個的實現,采用的是讀取/etc/mtab文件,找到/(即根目錄)掛載的設備文件,然后打開它,再用系統調用ioctl來實現的。

ioctl第二個參數為HDIO_GET_IDENTITY, 獲得指定文件描述符的標志號

ioctl的第三個參數為struct hd_driveid ,在linux/hdreg.h中,struct hd_driveid的聲明有

struct hd_driveid {

unsigned short config; / lots of obsolete bit flags */

unsigned short cyls; /* Obsolete, "physical" cyls */

unsigned short reserved2; /* reserved (word 2) */

unsigned short heads; /* Obsolete, "physical" heads */

unsigned short track_bytes; /* unformatted bytes per track */

unsigned short sector_bytes; /* unformatted bytes per sector */

unsigned short sectors; /* Obsolete, "physical" sectors per track */

unsigned short vendor0; /* vendor unique */

unsigned short vendor1; /* vendor unique */

unsigned short vendor2; /* Retired vendor unique */

unsigned char serial_no[20]; /* 0 = not_specified */

unsigned short buf_type; /* Retired */

unsigned short buf_size; /* Retired, 512 byte increments

* 0 = not_specified

*/

……

};

,這其中,serial_no為硬盤的序列號。如果此項為0,則為沒有提供。

#p#

思路明確了,以下為實現代碼:

static int

getdiskid (char *id, size_t max)

{

int fd;

struct hd_driveid hid;

FILE *fp;

char line[0x100], *disk, *root, *p;

fp = fopen ("/etc/mtab", "r");

if (fp == NULL)

{

fprintf (stderr, "No /etc/mtab file.\n");

return -1;

}

fd = -1;

while (fgets (line, sizeof line, fp) != NULL)

{

disk = strtok (line, " ");

if (disk == NULL)

{

continue;

}

root = strtok (NULL, " ");

if (root == NULL)

{

continue;

}

if (strcmp (root, "/") == 0)

{

for (p = disk + strlen (disk) - 1; isdigit (*p); p --)

{

*p = '\0';

}

fd = open (disk, O_RDONLY);

break;

}

}

fclose (fp);

if (fd < 0)

{

fprintf (stderr, "open hard disk device failed.\n");

return -1;

}

if (ioctl (fd, HDIO_GET_IDENTITY, &hid) < 0)

{

fprintf (stderr, "ioctl error.\n");

return -1;

}

close (fd);

snprintf (id, max, "%s", hid.serial_no);

fprintf (stdout, "get hard disk serial number: %s\n", id);

return 0;

}

獲取MAC地址

通過創建一個socket,然后bind特定的IP地址,就可以通過ioctl得到這個套按地綁定的網絡接口名稱。然后再通過網絡接口名稱,得到MAC地址。

如果ioctl的第二個參數為SIOCGIFNAME, 則獲得指定網絡接口的名稱;如果ioctl的第二個參數為SIOCGIFHWADDR,則獲得指定網絡接口的MAC地址

ioctl的第三個參數為struct ifreq ,在linux/if.h頭文件里,struct ifreq聲明如下:

struct ifreq

{

#define IFHWADDRLEN 6

union

{

char ifrn_name[IFNAMSIZ]; / if name, e.g. "en0" */

} ifr_ifrn;

union {

struct sockaddr ifru_addr;

struct sockaddr ifru_dstaddr;

struct sockaddr ifru_broadaddr;

struct sockaddr ifru_netmask;

struct sockaddr ifru_hwaddr;

short ifru_flags;

int ifru_ivalue;

int ifru_mtu;

struct ifmap ifru_map;

char ifru_slave[IFNAMSIZ]; /* Just fits the size */

char ifru_newname[IFNAMSIZ];

void * ifru_data;

struct if_settings ifru_settings;

} ifr_ifru;

}

#p#

其中,ifrn_name為網絡接口的名稱,ifr_ifru.ifru_hwaddr為網絡接口的MAC地址。

#ifndef MAX_IFINDEX

# define MAX_IFINDEX 8

#endif

static int

getmacaddr (const char *ip, char *id, size_t max)

{

int i, sockfd;

struct sockaddr_in *loc;

struct ifreq req[1];

sockfd = socket (AF_INET, SOCK_DGRAM, 0);

if (sockfd < 0)

{

fprintf (stderr, "Unable to create socket.\n");

return -1;

}

for (i = 0; i <= MAX_IFINDEX; ++ i)

{

req->ifr_ifindex = i;

if (ioctl (sockfd, SIOCGIFNAME, req) < 0)

{

fprintf (stderr, "ioctl error: %s\n", strerror (errno));

continue;

}

if (ioctl (sockfd, SIOCGIFADDR, req) < 0)

{

fprintf (stderr, "ioctl interface index [%d] error: %s\n", i, strerror (errno));

continue;

}

loc = (struct sockaddr_in *) (&(req->ifr_ifru.ifru_addr));

if (loc->sin_addr.s_addr == inet_addr (ip))

{

fprintf (stderr, "%s bind at %s.\n", ip, req->ifr_name);

break;

}

}

if (i > MAX_IFINDEX)

{

fprintf (stderr, "input IP error.\n");

close (sockfd);

return -1;

}

if (ioctl (sockfd, SIOCGIFHWADDR, req) < 0)

{

fprintf (stderr, "ioctl error: %s\n", strerror (errno));

close (sockfd);

return -1;

}

close (sockfd);

snprintf (id, max, "%02X%02X%02X%02X%02X%02X",

req->ifr_hwaddr.sa_data[0] & 0xff,

req->ifr_hwaddr.sa_data[1] & 0xff,

req->ifr_hwaddr.sa_data[2] & 0xff,

req->ifr_hwaddr.sa_data[3] & 0xff,

req->ifr_hwaddr.sa_data[4] & 0xff,

req->ifr_hwaddr.sa_data[5] & 0xff);

fprintf (stdout, "MAC address of %s: [%s].\n", req->ifr_name, id);

return 0;

}

【編輯推薦】

  1. Linux環境下雙網卡主機路由配置
  2. linux下如何破解windows密碼
  3. Linux下配置JDK和Tomcat
責任編輯:趙寧寧 來源: chinaitlab
相關推薦

2010-01-11 17:49:36

VB.NET硬盤序列號

2023-12-29 08:22:52

lsblk命令存儲

2009-09-04 08:17:04

Windows 7序列號檢查器

2011-04-19 09:25:51

2009-02-09 15:51:48

Windows 7序列號免費

2009-09-14 08:36:21

Windows 7正版序列號

2011-07-11 15:20:15

MAC地址java

2011-04-19 09:30:33

2009-12-04 13:56:58

安裝Windows 7

2019-10-12 00:03:07

MyCat數據庫分庫分表

2009-12-07 17:17:00

Windows 7操作

2011-08-30 15:19:07

2018-08-19 20:00:20

Linux命令系統硬件

2010-09-02 17:27:18

SQL Server安裝

2009-07-24 10:38:35

ASP.NET獲取MA

2024-09-23 12:10:00

C#MAC代碼

2010-01-11 18:21:22

VB.NET獲取硬盤信

2009-11-11 08:57:48

Windows 7升級序列號

2021-12-07 05:53:36

IDMWindows 運維

2009-12-09 09:52:57

ibmdwFileNet
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性欧美精品一区二区三区在线播放 | 国产亚洲精品一区二区三区 | 国产在线激情视频 | 在线āv视频 | 久久久久av| 日韩在线视频免费观看 | 亚洲欧洲日韩精品 中文字幕 | 2022国产精品 | 国产激情视频在线免费观看 | 久久国产成人 | 97视频成人 | 久久精品免费观看 | 亚洲人人 | 欧美黄页| 欧美99久久精品乱码影视 | 热久久国产 | 在线看日韩 | 精品一区久久 | 国产精品久久久久一区二区三区 | 色爽女| 午夜爽爽爽男女免费观看影院 | 精品乱码一区二区三四区 | 国产精品久久久久久久久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 成人精品毛片国产亚洲av十九禁 | 女女百合av大片一区二区三区九县 | 亚洲一区二区视频 | 欧美区在线 | 国产高清久久 | 欧美成人免费在线 | 日韩中文字幕在线免费 | 久久久久久久久久久福利观看 | 成年免费视频 | 久久夜视频 | 亚洲深夜福利 | 国产亚洲一区二区三区在线观看 | 天天干天天干 | 人操人免费视频 | 精品欧美一区二区久久久伦 | 亚洲视频www | 日韩av一区二区在线观看 |