/
memset
/
stream_class_working_client_protocols
Обзор
Документация
Войти
/
memset
/
stream_class_working_client_protocols
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
stream_sock.cpp
71 строка
3 KB
petrova_ms
Добавлены файлы в репозиторий
04 июн 2026, 21:09
04 июн 2026, 21:09
b581318
Код
Авторство
О чём код?
/** @file stream_sock.cpp @author Петрова М.С. (memset) @version 1.0 @date 2025 @note Реализована функция потока stream_sock */ #include <unistd.h> #include <errno.h> #include <cstring> #include "working_clients.h" void * fun_stream_sock(void * param_stream) { in_working_clients_st param = *(in_working_clients_st *) param_stream; // устанавливает состояние отменяемости pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); //Поток можно отменить //оказывает влияние только на тот поток, в котором вызвана. pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); //асинхронно отменяемый в любой точке его выполнения bool flag_work_server = true; if(param.socket != -1) { WorkingClientsTrack workingClientsTrack(param); if(workingClientsTrack.get_status_obj().status < 0) flag_work_server = false; while(flag_work_server) { // Удалить отвалившихся клиентов workingClientsTrack.delete_clients(); // Проверить есть ли установленные флаги на действия, не связанные с работой с сокетами workingClientsTrack.check_flags_all_protocols(); // Проинициализировать наборы дескрипторов для чтения и записи workingClientsTrack.install_read_write_sets(); // Мониторинг дескрипторов int ret = workingClientsTrack.socket_monitoring(); //printf("************ cselect ret = %i \n", ret); if(ret > 0) { // Проверка есть ли новые клиенты, присоеденившиеся к мастер сокету int ret = workingClientsTrack.check_read_set_on_master_sock(); //printf("************ check_read_set_on_master_sock вернула = %i \n", ret); if(!ret) { // Проверка есть ли сокет, в который поступили данные ret = workingClientsTrack.check_read_set(); if(ret != -1) { // Проверка есть ли сокет готовый к записи (сокеты готовы к записи всегда) workingClientsTrack.check_write_set(); } } } else { workingClientsTrack.make_actions_if_no_clients(); } } } return NULL; }