?? main.cpp.bak
字號:
#include<stdio.h>#include<sys/time.h>#include<unistd.h>#include<stdlib.h>#include <fcntl.h>#include<signal.h>#include<sys/wait.h>#include<sys/types.h>#include<string.h>#include<memory.h>#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#include<string>using namespace std;#define MAXID 50#define MAXNAME 50#define MAXBUF 256#define SERVERIP "192.168.178.50"#define SERVERPORT 4567#include"IniFile.h"#include"libvirt.h"/* the data structure of time */ typedef struct timeInfo { long long cpu_time; struct timeval real_time; } timeInfoNode;typedef struct domainInfo{ int id; char ip[16]; char domainname[MAXNAME]; int weight; int cap; int time;}domainInfoNode;domainInfoNode DomainInfo[MAXID];struct ClientParam{ int id; int time; int clientsock;};int ids[MAXID]; /* the hypervisor connection */ static virConnectPtr conn = NULL;void getTimeInfo(int id, timeInfoNode * infos){ virDomainPtr dom = NULL; virDomainInfo info; int ret; /* Find the domain of the given id */ dom = virDomainLookupByID(conn, id); if (dom == NULL) { fprintf(stderr, "Failed to find Domain %d\n", id); // freeDom(dom); // closeConn(); return ; } /* Get the information of the domain */ ret = virDomainGetInfo(dom, &info); if (ret < 0) { fprintf(stderr, "Failed to get information for Domain %d\n", id); // freeDom(dom); // closeConn(); } /* get the start of realTime*/ if (gettimeofday(&(infos->real_time), NULL) == - 1) { fprintf(stderr, "Failed to get start time\n"); return; } /* get the start of CPUTime*/ infos->cpu_time = info.cpuTime; /* nanosecond */ // freeDom(dom); }void getDomainInfo(int id, timeInfoNode infos) { virDomainPtr dom = NULL; virDomainInfo info; int ret; struct timeval realTime; int cpu_diff, real_diff; double usage; /* Find the domain of the given id */ dom = virDomainLookupByID(conn, id); if (dom == NULL) { fprintf(stderr, "Failed to find Domain %d\n", id); // freeDom(dom); // closeConn(); return ; } /* Get the information of the domain */ ret = virDomainGetInfo(dom, &info); if (ret < 0) { fprintf(stderr, "Failed to get information for Domain %d\n", id); // freeDom(dom); // closeConn(); return; } /* get the end of realTime*/ if (gettimeofday(&realTime, NULL) == - 1) { fprintf(stderr, "Failed to get start time\n"); return; } /* calculate the usage of cpu */ cpu_diff = (info.cpuTime - infos.cpu_time) / 1000; real_diff = 1000000 *(realTime.tv_sec - infos.real_time.tv_sec) + (realTime.tv_usec - infos.real_time.tv_usec); usage = cpu_diff / (double)(real_diff); /* print the results */ usage = usage*100/DomainInfo[id].cap*100; if(usage>100) usage = 100; printf("usage=%.2lf\n",usage); return;} void GetCpurate(int id){ timeInfoNode * infos = new timeInfoNode; //conn = virConnectOpenReadOnly(NULL); getTimeInfo(id,infos); printf("infos->cpu_time=%lld\n",infos->cpu_time); sleep(1); getDomainInfo(id,*infos); return ;}struct ClientInfo{ pthread_t pid; int domainid; char ip[16];};ClientInfo clientinfo[MAXID];int nparams;void GetDomainInfoin(int idCount){ int i,status; int ret = fork(); if(ret==0) { freopen("domaininfo.tmp","w",stdout); char * argv[ ]={"xm","sched-credit",(char*)0}; int rst = execv("/usr/sbin/xm",argv); fclose(stdout); } wait(&status); printf("已經輸出\n"); i = 0; int flag = 0; freopen("domaininfo.tmp","r",stdin); char buf[1000]; fgets(buf,sizeof(buf),stdin); while(scanf("%s %d %d %d",DomainInfo[i].domainname,&DomainInfo[i].id,&DomainInfo[i].weight,&DomainInfo[i].cap)!=EOF) { i++; } fclose(stdin); for(i = 0;i<idCount;i++) { printf("%s %d %d %d\n",DomainInfo[i].domainname,DomainInfo[i].id,DomainInfo[i].weight,DomainInfo[i].cap); } }int Domainnumber = 0;void Init(){ int i; int status; conn = virConnectOpenReadOnly(NULL); if (conn == NULL) { fprintf(stderr, "Failed to connect to hypervisor\n"); return ; } int idCount = virConnectListDomains(conn, &ids[0], MAXID); if (idCount < 0) { fprintf(stderr, "Failed to list the domains\n"); // closeConn(); return ; } printf("Domain Totals: %d\n", idCount); printf("讀取配置前的信息\n"); GetDomainInfoin(idCount); IniFile Init; Init.SetFile("InitDomain.ini"); int errLine; bool sus = Init.load(errLine); if(!sus)printf("讀取配置文件失敗\n"); Domainnumber = Init.ReadInteger("DomainInfo","Number"); char par1[10],par2[10],par3[10],buf[255]; int sum = 0; string ip; for(i = 0;i<idCount;i++) { sprintf(buf,"Domain%d",i); DomainInfo[i].weight = Init.ReadInteger(buf,"weight"); ip = Init.ReadString(buf,"ip"); strcpy(DomainInfo[i].ip,ip.c_str()); DomainInfo[i].time = Init.ReadInteger(buf,"time"); sprintf(par1,"%d", DomainInfo[i].id); sprintf(par2,"%d",DomainInfo[i].weight); int ret = fork(); if(ret==0) { char * argv[ ]={"xm","sched-credit","-d",par1,"-w",par2,(char*)0}; int rst = execv("/usr/sbin/xm",argv); } wait(&status); sum +=DomainInfo[i].weight; } int cap = 100; for(i = 0;i<idCount;i++) { if(i==idCount-1) { DomainInfo[i].cap =cap ; } else { DomainInfo[i].cap = (int)((DomainInfo[i].weight*100)/sum*1.0); cap = cap - DomainInfo[i].cap; } sprintf(par1,"%d", DomainInfo[i].id); sprintf(par2,"%d",DomainInfo[i].cap); int ret = fork(); if(ret==0) { char * argv[ ]={"xm","sched-credit","-d",par1,"-c",par2,(char*)0}; int rst = execv("/usr/sbin/xm",argv); } wait(&status); } printf("設置完后的信息\n"); GetDomainInfoin(idCount);}#define CLIENTNUM 10int ssock,csock;struct sockaddr_in client_addr,server_addr;char buf[MAXBUF];int clientnum=0;ClientParam clientparam[MAXID];int GetdomainId(char* ip){ int id,i; for(i = 0;i<Domainnumber;i++) { if(!strcmp(DomainInfo[i].ip,ip)) return i; } return -1;}void *clientmsg(void* param){ ClientParam* ptr =(ClientParam*)param; char snd_buf[1024]; int time = ptr->time; int id = ptr->id; while(1) { memset(snd_buf,0,sizeof(snd_buf)); sprintf(snd_buf,"%s","workload"); printf("發送workload消息\n"); send(clientparam[id].clientsock,snd_buf,sizeof(snd_buf),0); sleep(time); }}int main(){ Init(); if((ssock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0) { perror("socket error:"); exit(1); } socklen_t clen = sizeof(client_addr); memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family =AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(SERVERPORT); if(bind(ssock,(struct sockaddr *)&server_addr,sizeof(server_addr))<0) { perror("bind error"); exit(1); } if(listen(ssock,10)<0) { perror("listen error:"); exit(1); } sockaddr_in addr; int ret; socklen_t len = sizeof(addr); printf("服務器%s啟動......\n",SERVERIP); while(csock=accept(ssock,(struct sockaddr *)&client_addr,&clen)) { clientparam[clientnum].clientsock=csock; getsockname(csock,(struct sockaddr *)&addr ,&len); sprintf(clientinfo[clientnum].ip,"%s",inet_ntoa(addr.sin_addr)); printf("來自%s的連接\n",clientinfo[clientnum].ip); clientinfo[clientnum].domainid = GetdomainId(clientinfo[clientnum].ip); clientparam[clientnum].id = clientnum; clientparam[clientnum].time = DomainInfo[clientinfo[clientnum].domainid].time; ret = pthread_create(&clientinfo[clientnum].pid, NULL, clientmsg, &clientparam[clientnum]); if(ret<0) printf("創建線程失敗\n"); clientnum++; } return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -