Administrator
Published on 2024-05-13 / 22 Visits
0
0

C语言获取服务器内存CPU占用并通过udp发送

代码:
udp_get_cpu_mem.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/sysinfo.h>
#include <sys/time.h>
#include <sys/select.h>

void error(const char *msg) {
    perror(msg);
    exit(1);
}

long get_cpu_usage() {
    FILE *fp;
    long user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice;
    long total_usage, total_idle, total_usage_diff, total_idle_diff;
    static long last_total_usage = 0, last_total_idle = 0;
    char line[256];

    fp = fopen("/proc/stat", "r");
    if (fp == NULL) {
        error("ERROR opening /proc/stat");
    }

    fgets(line, 256, fp);
    sscanf(line, "cpu %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", &user, &nice, &system, &idle, &iowait, &irq, &softirq, &steal, &guest, &guest_nice);

    total_usage = user + nice + system + idle + iowait + irq + softirq + steal;
    total_idle = idle + iowait;

    total_usage_diff = total_usage - last_total_usage;
    total_idle_diff = total_idle - last_total_idle;

    last_total_usage = total_usage;
    last_total_idle = total_idle;

    fclose(fp);

    return (total_usage_diff - total_idle_diff) * 100 / total_usage_diff;
}

long get_memory_usage() {
    FILE *fp;
    long total_memory, available_memory, used_memory;
    char line[256];

    fp = fopen("/proc/meminfo", "r");
    if (fp == NULL) {
        error("ERROR opening /proc/meminfo");
    }

    while (fgets(line, 256, fp) != NULL) {
        if (sscanf(line, "MemTotal: %ld kB", &total_memory) == 1) {
            continue;
        }
        if (sscanf(line, "MemAvailable: %ld kB", &available_memory) == 1) {
            break;
        }
    }
    fclose(fp);

    used_memory = total_memory - available_memory;
    return used_memory * 100 / total_memory;
}

int main(int argc, char *argv[]) {
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[256];
    struct timeval timeout;

    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }

    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(portno);

    while (1) {
        fd_set fds;
        FD_ZERO(&fds);

        timeout.tv_sec = 5; // 设置超时时间为5秒
        timeout.tv_usec = 0;

        int sel = select(0, NULL, NULL, NULL, &timeout);
        if (sel == -1) {
            error("ERROR in select");
        } else if (sel == 0) {
            // 超时,发送数据
            long cpu_usage = get_cpu_usage();
            long memory_usage = get_memory_usage();

            snprintf(buffer, sizeof(buffer), "CPU: %ld%%, Memory: %ld%%", cpu_usage, memory_usage);

            n = sendto(sockfd, buffer, strlen(buffer), 0, (const struct sockaddr *) &serv_addr, sizeof(serv_addr));
            if (n < 0) {
                error("ERROR in sendto");
            }
        } else {
            // select返回大于0,表示有活动描述符,但在这个简单例子中我们不处理这种情况
        }
    }

    close(sockfd);
    return 0;
}

编译:

 gcc -o getCpuMem udp_get_cpu_mem.c

运行:

./getCpuMem 192.168.5.175 1234

Comment