Добавил:
Я и кто? Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа ОС.docx
Скачиваний:
17
Добавлен:
02.02.2023
Размер:
104.21 Кб
Скачать

3. Разработка и описание алгоритма

Программа состоит из 4 основных модулей: server1, server2, и client. Server1, передает клиенту информацию о количестве подключённых мониторов и разрешении основного монитора, server2 передает клиенту информацию о модуле текущего процесса и о количестве свободной физической памяти, также пользователю дается возможность выбора, в какой метрике выводить количество свободной физической памяти.

При запуске клиента пользователь выбирает к какому серверу он хочет подключиться. Если ко второму, то программа уточнит в каких единицах вывести ОЗУ. Если информация на сервере поменялась, то сервер передает клиенту обновленную информацию, а клиент ее выводит. Также предусмотрена невозможность запуска дубликата сервера.

Результат применения программы

Запускаем первый и второй сервер, результат представлен на рисунках 1 и 2.

Рисунок 1 – Запуск server1

Рисунок 2 – Запуск server1

Запуск клиента представлен на рисунке 3

Рисунок 3 – Запуск client

Обращение к первому серверу представлено на рисунке 4.

Рисунок 4 – Обращение к первому серверу

Обращение ко второму серверу представлено на рисунке 5

Рисунок 5 – Обращение ко второму серверу

Заключение

В ходе выполнения данной курсовой работы были закреплены и углублены теоретические знания в области современных операционных систем, приобретены практические навыки разработки клиент-серверных приложений, использующих стандартные механизмы межпроцессного взаимодействия. Все цели и задачи, поставленные на курсовую работу, были успешно выполнены.

Список использованных источников

1) ГОСТ 7.32.2017 Система стандартов по информации, библиотечному и издательскому делу. Отчет о научно-исследовательской работе. Структура и правила оформления. – М.: Стандартинформ, 2017, - 27 с.

Приложение

Server1.c

#include <netinet/in.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <unistd.h>

#define PORT 8080

#include <X11/Xlib.h>

#include <pthread.h>

char* hello[1024];

void* tasks(void* inp){

    Display *display;

    Screen *screen;

    display = XOpenDisplay(NULL);

    int count_screens = ScreenCount(display);

    screen = ScreenOfDisplay(display, 0);

    sprintf(hello, "%s%i\n%s%d%d\n", "Total count screens: ", count_screens, "Разрешение экрана: ", screen->width, screen->height);

    XCloseDisplay(display);  

    }

int main(int argc, char const* argv[])

{

    FILE *fp;

    long size;

    system("ss -tulpan | grep 8080 > process1.txt");  

    fp = fopen("process1.txt", "r");

    fseek (fp, 0, SEEK_END);

    size = ftell(fp);  

    if (size != 0) {

        printf("Дубликат сервера умер(\n");

        exit(0);

    }

    system(" > process1.txt");  

    fclose(fp);

    //printf("Сервер запущен\n");

    int server_fd, new_socket, valread;

    struct sockaddr_in address;

    int opt = 1;

    int addrlen = sizeof(address);

    char buffer[1024] = { 0 };

   

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

        perror("socket failed");

        exit(EXIT_FAILURE);

    }

    if (setsockopt(server_fd, SOL_SOCKET,

                SO_REUSEADDR | SO_REUSEPORT, &opt,

                sizeof(opt))) {

        perror("setsockopt");

        exit(EXIT_FAILURE);

    }

    address.sin_family = AF_INET;

    address.sin_addr.s_addr = INADDR_ANY;

    address.sin_port = htons(PORT);

    if (bind(server_fd, (struct sockaddr*)&address,

            sizeof(address))

        < 0) {

        perror("bind failed");

        exit(EXIT_FAILURE);

    }

    while(1){

        pthread_t thread_id;

        pthread_create(&thread_id, NULL, tasks, NULL);

    if (listen(server_fd, 3) < 0) {

        perror("listen");

        exit(EXIT_FAILURE);

    }

   

    if ((new_socket

        = accept(server_fd, (struct sockaddr*)&address,

                (socklen_t*)&addrlen))

        < 0) {

        perror("accept");

        exit(EXIT_FAILURE);

    }

    send(new_socket, hello, strlen(hello), 0);

    pthread_join(thread_id, NULL);

    }

}

Server2.c

#include <netinet/in.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <unistd.h>

#define PORT 8069

#include <sys/sysinfo.h>

#include <pthread.h>

char* hello[1024];

  void* func(void* inp){

    struct sysinfo info;

    sysinfo(&info);

    char buffer1[512];

    readlink("/proc/self/exe", buffer1, BUFSIZ);

    sprintf(hello, "%lu%s\n%s%s\n", info.freeram, "(байт): Объем свободной оперативной памяти", "Модуль процесса ", buffer1);  

    }

int main(int argc, char const* argv[])

{  

    FILE *fp;

    long size;

    system("ss -tulpan | grep 8069 > process2.txt");

                                                   

    fp = fopen("process2.txt", "r");

    fseek (fp, 0, SEEK_END);

    size = ftell(fp);

    if (size != 0) {

        printf("Дубликат сервера умер(\n");

        exit(0);

    }

    system(" > process2.txt");  

    fclose(fp);

    printf("Сервер запущен\n");

    int server_fd, new_socket, valread;

    struct sockaddr_in address;

    int opt = 1;

    int addrlen = sizeof(address);

    char buffer[1024] = { 0 };

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

        perror("socket failed");

        exit(EXIT_FAILURE);

    }

    if (setsockopt(server_fd, SOL_SOCKET,

                SO_REUSEADDR | SO_REUSEPORT, &opt,

                sizeof(opt))) {

        perror("setsockopt");

        exit(EXIT_FAILURE);

    }

    address.sin_family = AF_INET;

    address.sin_addr.s_addr = INADDR_ANY;

    address.sin_port = htons(PORT);

    if (bind(server_fd, (struct sockaddr*)&address,

            sizeof(address))

        < 0) {

        perror("bind failed");

        exit(EXIT_FAILURE);

    }

     while(1){

        pthread_t thread_id;

        pthread_create(&thread_id, NULL, func, NULL);

    if (listen(server_fd, 3) < 0) {

        perror("listen");

        exit(EXIT_FAILURE);

    }

   

    if ((new_socket

        = accept(server_fd, (struct sockaddr*)&address,

                (socklen_t*)&addrlen))

        < 0) {

        perror("accept");

        exit(EXIT_FAILURE);

    }

    send(new_socket, hello, strlen(hello), 0);

    pthread_join(thread_id, NULL);

    }

}

Client.c

#include <arpa/inet.h>

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <unistd.h>

#include <stdlib.h>

#include <math.h>

#define PORT1 8080

#define PORT2 8069

int main(int argc, char const* argv[])

{

    int i, port, c, intbuf;

    c = 0;

    char mem[20];

    int ramcoef = 1;

    while (c==0){

    printf("Выберите к какому серверу вы хотите подключиться(Введите 1 или 2):\nСервер 1: Узнать количество мониторов и размеры основного монитора\nСервер 2: Узнать имя модуля текущего процесса и количество свободной ОЗУ\n");

    scanf("%i", &i);

    if (i == 1){

        port = PORT1;

        c=1;

    }

    else if (i == 2){

        port = PORT2;

        printf("В каком формате вывести количество свободной физической памяти?(Введите цифру от 1 до 4) \n1)Байты\n2)Килобайты \n3)Мегабайты \n4)Гигабайты\n");

        scanf("%i", &i);

        if (i==1){

            ramcoef = 1;

            sprintf(mem, "%s", "b");

            c = 1;

        }

        if (i==2){

            ramcoef = 1024;

            sprintf(mem, "%s", "kb");

            c = 1;

        }

        if (i==3){

            ramcoef = 1024*1024;

            sprintf(mem, "%s", "mb");

            c = 1;

        }

        if(i==4){

            ramcoef = 1024*1024*1024;

            sprintf(mem, "%s", "gb");

            c = 1;

        }

    }

    }

    char buffer[1024] = { 0 };

    char prebuffer[1024] = { 0 };

    char printbuffer[1024] = { 0 };

    while(1){

    int sock = 0, valread, client_fd;

    struct sockaddr_in serv_addr;

    //char* hello = a;

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

        printf("\n Socket creation error \n");

        return -1;

    }

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_port = htons(port);

    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)

        <= 0) {

        printf(

            "\nInvalid address/ Address not supported \n");

        return -1;

    }

    if ((client_fd

        = connect(sock, (struct sockaddr*)&serv_addr,

                sizeof(serv_addr)))

        < 0) {

        printf("\nConnection Failed \n");

        return -1;

    }

    sprintf(prebuffer, "%s", buffer);

    valread = read(sock, buffer, 1024);

    int t = strcmp(buffer, prebuffer);

    if (port==8069){

    intbuf = atoi (buffer);

    float valmem = (float)intbuf / (float)ramcoef;

    sprintf(printbuffer, "%s%s%10.2f%s", buffer, "Количество памяти в заданных единицах ", valmem, mem);

    }

    if (port==8080){

    sprintf(printbuffer, "%s", buffer);

       

    }

    if (strcmp(buffer, prebuffer)!=0){

    printf("%s\n\n", printbuffer);

    }

    sleep(1);

   

    }

}