371 lines
12 KiB
C
371 lines
12 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
#include <string.h>
|
||
#include <stdbool.h>
|
||
#include <sys/socket.h> //包含套接字的函数库
|
||
#include <netinet/in.h> //包含AF_INET的相关结构
|
||
#include <arpa/inet.h> //包含AF_INET的操作函数
|
||
|
||
|
||
#define MAXBUFSIZE 1024
|
||
#define WAIT_SECOND 3 //暂停时间,单位为“秒”
|
||
#define PROJECTNAME "haojiangbo"
|
||
|
||
#define PORT 9999 //你服务器的端口号
|
||
#define HOST "127.0.0.1" //你服务器的IP
|
||
typedef struct occupy
|
||
{
|
||
char name[20];
|
||
unsigned int user;
|
||
unsigned int nice;
|
||
unsigned int system;
|
||
unsigned int idle;
|
||
} CPU_OCCUPY ;
|
||
|
||
typedef struct SysInfo
|
||
{
|
||
int me_cpu_num;
|
||
float me_cpu_used;
|
||
float me_mem_used;
|
||
float me_io_used;
|
||
char me_disk_used[10];
|
||
char me_download[1024];
|
||
}SysInfo;
|
||
|
||
|
||
typedef struct HJB_MEM{
|
||
char title[20];
|
||
char total[20];
|
||
char used[20];
|
||
char free[20];
|
||
char sjared[20];
|
||
char catch[20];
|
||
char available[20];
|
||
}HJB_MEM;
|
||
|
||
|
||
typedef struct HJB_NETWORK{
|
||
char rxkb[20];
|
||
char txkb[20];
|
||
char name[100];
|
||
}HJB_NETWORK;
|
||
|
||
|
||
float g_cpu_used;
|
||
int cpu_num; //定义一个全局的int类型cup_num
|
||
void cal_occupy(CPU_OCCUPY *, CPU_OCCUPY *);
|
||
void get_occupy(CPU_OCCUPY *);
|
||
float get_io_occupy();
|
||
void get_disk_occupy(char **reused);
|
||
float hjbGetMemInfo(HJB_MEM *mem);
|
||
void hjbGetNetWorkInfo(HJB_NETWORK *hjb_network);
|
||
int main(){
|
||
CPU_OCCUPY ocpu,ncpu;
|
||
HJB_MEM hjb_mem;
|
||
HJB_NETWORK hjb_network;
|
||
|
||
//描述客户端的socket
|
||
struct sockaddr_in addr;
|
||
//消息长度
|
||
int dataBytes = 0;
|
||
//消息
|
||
char sendbuf[MAXBUFSIZE];
|
||
char recvbuf[MAXBUFSIZE];
|
||
|
||
//客户端套接字标识符,只需要一个套接字文件描述符,用于和客户端通信
|
||
int sockfd;
|
||
//创建套接字
|
||
sockfd = socket(AF_INET,SOCK_STREAM,0);
|
||
if(sockfd < 0){
|
||
perror("创建套接字失败");
|
||
return 0;
|
||
}
|
||
printf("创建套接字成功\n");
|
||
addr.sin_family = AF_INET;
|
||
//定义服务端的套接字端口
|
||
addr.sin_port = htons(PORT);
|
||
|
||
//指定服务器端的ip,本地测试:127.0.0.1
|
||
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
|
||
addr.sin_addr.s_addr = inet_addr(HOST);
|
||
|
||
/**********************连接服务器**********************/
|
||
if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||
{
|
||
perror("连接服务器失败");
|
||
}
|
||
printf("连接到服务器成功...\n");
|
||
|
||
while (true){
|
||
SysInfo *sysInfo;
|
||
sysInfo = (SysInfo *)malloc(sizeof(SysInfo));
|
||
sleep(3);
|
||
printf("--------------------------------\n");
|
||
//获取cpu核数
|
||
cpu_num = sysconf(_SC_NPROCESSORS_ONLN);
|
||
sysInfo->me_cpu_num = cpu_num;
|
||
printf("cpu mum:%d\n",sysInfo->me_cpu_num);
|
||
//获取cpu使用率
|
||
get_occupy(&ocpu);
|
||
sleep(1);
|
||
get_occupy(&ncpu);
|
||
cal_occupy(&ocpu, &ncpu);
|
||
sysInfo->me_cpu_used = g_cpu_used;
|
||
//获取内存使用率
|
||
sysInfo->me_mem_used = hjbGetMemInfo(&hjb_mem)*100;
|
||
|
||
//IO内存使用率
|
||
sysInfo->me_io_used = get_io_occupy();
|
||
|
||
//获取当前磁盘的使用率
|
||
char *used;
|
||
get_disk_occupy(&used);
|
||
printf("used_path2 = %d \n",&used);
|
||
strcpy(sysInfo->me_disk_used,used);
|
||
free(used);
|
||
printf("sysInfo->me_disk_used = %s \n",sysInfo->me_disk_used);
|
||
|
||
//获取网卡信息
|
||
hjbGetNetWorkInfo(&hjb_network);
|
||
printf("network read Info %s %s %s \n", hjb_network.name,hjb_network.rxkb,
|
||
hjb_network.txkb);
|
||
|
||
strcat(sysInfo->me_download,hjb_network.name);
|
||
strcat(sysInfo->me_download,"> rxkb: ");
|
||
strcat(sysInfo->me_download,hjb_network.rxkb);
|
||
strcat(sysInfo->me_download," txkb: ");
|
||
strcat(sysInfo->me_download,hjb_network.txkb);
|
||
|
||
char *sendInfo = (char *)malloc(1024);
|
||
if(sendInfo != NULL){
|
||
//memcpy(sendInfo,sysInfo, sizeof(SysInfo));
|
||
sprintf(sendInfo,"{\"cpunuber\":%d,\n"
|
||
"\"cpu_used\":%4.2f,\n"
|
||
"\"mem_used\":%4.2f,\n"
|
||
"\"download\":\" %s \",\n"
|
||
"\"io_used\":%4.2f,\n"
|
||
"\"disk_used\":\"%s\",\n"
|
||
"\"projectName\":\"%s\"}\n",
|
||
sysInfo->me_cpu_num,
|
||
sysInfo->me_cpu_used,
|
||
sysInfo->me_mem_used,
|
||
sysInfo->me_download,
|
||
sysInfo->me_io_used,
|
||
sysInfo->me_disk_used,
|
||
PROJECTNAME);
|
||
|
||
if (sockfd > 0){
|
||
int resultValue = send(sockfd,sendInfo, strlen(sendInfo),MSG_NOSIGNAL);
|
||
printf("sendMessage value = \n %s \n", sendInfo);
|
||
printf("sendMessage len -> %d \n",strlen(sendInfo));
|
||
if (resultValue == -1){
|
||
close(sockfd);
|
||
/**********************连接服务器**********************/
|
||
printf("正在尝试重新连接........\n");
|
||
//创建套接字
|
||
sockfd = socket(AF_INET,SOCK_STREAM,0);
|
||
if(sockfd < 0){
|
||
perror("创建套接字失败..\n");
|
||
return 0;
|
||
}
|
||
printf("创建套接字成功\n");
|
||
addr.sin_family = AF_INET;
|
||
//定义服务端的套接字端口
|
||
addr.sin_port = htons(PORT);
|
||
|
||
//指定服务器端的ip,本地测试:127.0.0.1
|
||
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
|
||
addr.sin_addr.s_addr = inet_addr(HOST);
|
||
|
||
/**********************连接服务器**********************/
|
||
if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||
{
|
||
perror("连接服务器失败");
|
||
}
|
||
printf("重新连接成功...\n");
|
||
}
|
||
printf("发送消息返回指 %d \n",resultValue);
|
||
} else{
|
||
printf("正在尝试重新连接........\n");
|
||
//创建套接字
|
||
sockfd = socket(AF_INET,SOCK_STREAM,0);
|
||
if(sockfd < 0){
|
||
perror("创建套接字失败..\n");
|
||
return 0;
|
||
}
|
||
printf("创建套接字成功..\n");
|
||
addr.sin_family = AF_INET;
|
||
//定义服务端的套接字端口
|
||
addr.sin_port = htons(PORT);
|
||
|
||
//指定服务器端的ip,本地测试:127.0.0.1
|
||
//inet_addr()函数,将点分十进制IP转换成网络字节序IP
|
||
addr.sin_addr.s_addr = inet_addr(HOST);
|
||
|
||
/**********************连接服务器**********************/
|
||
if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||
{
|
||
perror("连接服务器失败");
|
||
}
|
||
printf("重新连接成功...\n");
|
||
}
|
||
|
||
//recv(sockfd,recvbuf,MAXBUFSIZE,0);
|
||
free(sysInfo);
|
||
free(sendInfo);
|
||
// close(sockfd);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
//close(sockfd);
|
||
|
||
}
|
||
|
||
|
||
float hjbGetMemInfo(HJB_MEM *mem) {
|
||
char buff1[MAXBUFSIZE];
|
||
char buff2[MAXBUFSIZE];
|
||
FILE *free;
|
||
free = popen("free", "r");
|
||
if (free == NULL) {
|
||
return 0;
|
||
}
|
||
fgets(buff1, sizeof(buff1), free);
|
||
fgets(buff2, sizeof(buff2), free);
|
||
// printf("read = %s, \n",buff2);
|
||
sscanf(buff2, "%s %s %s %s %s %s %s",
|
||
mem->title, mem->total,
|
||
mem->used, mem->free,
|
||
mem->sjared, mem->catch,
|
||
mem->available);
|
||
int total ;
|
||
int used;
|
||
int catch;
|
||
sscanf(mem->total,"%d",&total);
|
||
sscanf(mem->used,"%d",&used);
|
||
sscanf(mem->catch,"%d",&catch);
|
||
float use = (used+catch)/((double)total);
|
||
pclose(free);
|
||
return use;
|
||
}
|
||
|
||
|
||
void cal_occupy (CPU_OCCUPY *o, CPU_OCCUPY *n){
|
||
double od, nd;
|
||
double id, sd;
|
||
double scale;
|
||
od = (double) (o->user + o->nice + o->system +o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od
|
||
nd = (double) (n->user + n->nice + n->system +n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od
|
||
scale = 100.0 / (float)(nd-od); //100除强制转换(nd-od)之差为float类型再赋给scale这个变量
|
||
id = (double) (n->user - o->user); //用户第一次和第二次的时间之差再赋给id
|
||
sd = (double) (n->system - o->system);//系统第一次和第二次的时间之差再赋给sd
|
||
g_cpu_used = ((sd+id)*100.0)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
|
||
}
|
||
void get_occupy (CPU_OCCUPY *o) {
|
||
|
||
FILE *fd;
|
||
char buff[MAXBUFSIZE];
|
||
fd = fopen ("/proc/stat", "r"); //这里只读取stat文件的第一行及cpu总信息,如需获取每核cpu的使用情况,请分析stat文件的接下来几行。
|
||
fgets (buff, sizeof(buff), fd);
|
||
sscanf (buff, "%s %u %u %u %u", o->name, &o->user, &o->nice,&o->system, &o->idle);
|
||
fclose(fd);
|
||
}
|
||
|
||
|
||
float get_io_occupy(){
|
||
char cmd[] ="iostat -d -x";
|
||
char buffer[MAXBUFSIZE];
|
||
char a[20];
|
||
float arr[20];
|
||
FILE* pipe = popen(cmd, "r");
|
||
if (!pipe) return -1;
|
||
fgets(buffer, sizeof(buffer), pipe);
|
||
fgets(buffer, sizeof(buffer), pipe);
|
||
fgets(buffer, sizeof(buffer), pipe);
|
||
fgets(buffer, sizeof(buffer), pipe);
|
||
sscanf(buffer,"%s %f %f %f %f %f %f %f %f %f %f %f %f %f ",a,&arr[0],&arr[1],&arr[2],&arr[3],&arr[4],&arr[5],&arr[6],&arr[7],&arr[8],&arr[9],&arr[10],&arr[11],&arr[12]);
|
||
//printf("%f\n",arr[12]);
|
||
pclose(pipe);
|
||
return arr[12];
|
||
}
|
||
|
||
void get_disk_occupy(char **reused){
|
||
char currentDirectoryPath[ MAXBUFSIZE ];
|
||
getcwd(currentDirectoryPath, MAXBUFSIZE);
|
||
//printf("当前目录:%s\n",currentDirectoryPath);
|
||
char cmd[50]="df ";
|
||
strcat(cmd,currentDirectoryPath);
|
||
//printf("%s\n",cmd);
|
||
|
||
char buffer[MAXBUFSIZE];
|
||
FILE* pipe = popen(cmd, "r");
|
||
char fileSys[20];
|
||
char blocks[20];
|
||
char used[20];
|
||
char free_[20];
|
||
char percent[10];
|
||
char moment[20];
|
||
|
||
if (!pipe) return ;
|
||
|
||
if(fgets(buffer, sizeof(buffer), pipe)!=NULL){
|
||
sscanf(buffer,"%s %s %s %s %s %s",fileSys,blocks,used,free_,percent,moment);
|
||
}
|
||
if(fgets(buffer, sizeof(buffer), pipe)!=NULL){
|
||
sscanf(buffer,"%s %s %s %s %s %s",fileSys,blocks,used,free_,percent,moment);
|
||
}
|
||
*reused = (char *)malloc(sizeof(percent));
|
||
memcpy(*reused,&percent, sizeof(percent));
|
||
/*printf("used_path1 = %d \n",&*reused);
|
||
printf("percent mem used: = %s\n",percent);
|
||
printf("reused mem used: = %s\n",*reused);*/
|
||
pclose(pipe);
|
||
}
|
||
|
||
void hjbGetNetWorkInfo(HJB_NETWORK *hjb_network){
|
||
FILE *file;
|
||
file = popen("sar -n DEV 1 1 | grep e","r");
|
||
char buff1[1024];
|
||
if(NULL == file){
|
||
return;
|
||
}
|
||
fgets(buff1, sizeof(buff1),file);
|
||
fgets(buff1, sizeof(buff1),file);
|
||
//printf("netWordReadData1 = %s \n",buff1);
|
||
sscanf(buff1,"%*s %*s %s %*s %*s %s %s %*s %*s %*s",
|
||
hjb_network->name,hjb_network->rxkb,
|
||
hjb_network->txkb);
|
||
pclose(file);
|
||
}
|
||
|
||
void getCurrentDownloadRates(long int * save_rate)
|
||
{
|
||
char intface[] = "eth0:"; //这是网络接口名,根据主机配置
|
||
//char intface[] = "wlan0:";
|
||
FILE * net_dev_file;
|
||
char buffer[1024];
|
||
size_t bytes_read;
|
||
char * match;
|
||
if ( (net_dev_file=fopen("/proc/net/dev", "r")) == NULL )
|
||
{
|
||
printf("open file /proc/net/dev/ error!\n");
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
|
||
int i = 0;
|
||
while(i++<20){
|
||
if(fgets(buffer, sizeof(buffer), net_dev_file)!=NULL){
|
||
if(strstr(buffer,intface)!=NULL){
|
||
//printf("%d %s\n",i,buffer);
|
||
sscanf(buffer,"%s %ld",buffer,save_rate);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if(i==20) *save_rate=0.01;
|
||
fclose(net_dev_file); //关闭文件
|
||
return ;
|
||
} |