Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
10 / 8 / 2
Регистрация: 02.12.2018
Сообщений: 142

Свой собственный FD_SET для TCP сокета

11.09.2022, 14:25. Показов 2001. Ответов 10

Студворк — интернет-сервис помощи студентам
Приветствую. Я пишу приложение на TCP сокетах и мне не совсем хватает возможностей для учета подключенных клиентов.
В общем, нужно как то реализовать хранение каких либо дополнительных данных для каждого подключенного клиента.
Представим, что имеется сервер, на который могут приходить сотни подключений в секунду. Мне нужно отключить клиента через 5 секунд, если он не отправил никаких запросов ко мне на сервер, по этому нужно хранить время подключения каждого клиента, но где мне это сделать, если FD_SET рассчитан лишь на хранение сокета подключившегося клиента?
Мне пришла только идея, создать массив структур, которые будут хранить активный в данный момент сокет клиента и данные о времени подключения клиента.
Естественно придется все время перебирать данный массив структур и тратить на это время (в принципе как и FD_* макросы). Хотелось бы избежать любых дорогостоящих операций, потому что далее их при поступлении запроса их и так будет предостаточно.
Хотел сделать в FD_SET примерно такую структуру:
C++
1
2
3
4
5
6
7
8
9
struct client_data {
    SOCKET sock;
    TIME connect_time;
};
 
struct FD_SET {
    size_t num_of_clients;
    client_data clients[256];
};
Но в таком случае, мне нельзя использовать select, потому что он ожидает массив SOCKET.
В таком случае, мне вероятно пришлось бы написать свою версию функции select.

Пока что не готов использовать IOCP сокеты, потому что они сильно сломают кроссплатформенность.
Возможно это будет сделано в дальнейшем, но не сейчас.

Мне кажется что я иду неправильным путем и начинаю изобретать велосипед.
Есть ли какие то нормальные методы решения моей проблемы?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.09.2022, 14:25
Ответы с готовыми решениями:

Python аналог дескрипторовв fd_set и макросов FD_ZERO, FD_SET
Понадобилось переписать программу с с++ на python, не могу разобраться с сокетами. есть там кусочек которому я не могу найти аналог в...

Улучшенный класс сокета для Tcp и Udp протоколов
Всем привет.Написал библиотеку для упрощения работы с сокетами Tcp и Udp протоколов. Хочу узнать мнение по этому поводу. В дальнейшем...

Использование не блокируемого WinSock TCP сокета. Реализации таймаута для ожидания connect()
Необходимо реализовать TCP подключение и обменяться данными. В случае не доступности узла, к которому осуществляется подключение, функция...

10
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
11.09.2022, 18:43
Цитата Сообщение от Skymotion Посмотреть сообщение
В общем, нужно как то реализовать хранение каких либо дополнительных данных для каждого подключенного клиента.
Почему не использовать два массива? Только не забывать их поддерживать в консистентном состоянии.
1
10 / 8 / 2
Регистрация: 02.12.2018
Сообщений: 142
11.09.2022, 20:59  [ТС]
Croessmah, не совсем понял вашу идею
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.09.2022, 07:31
А у вас выбора нет.
Если вам надо быстро и качественно — придётся читать из портов завершения ввода‐вывода или io_uring на линексе.
Если вам надо медленно и кроссплатформенно — придётся использовать устаревший select.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
12.09.2022, 13:01
Цитата Сообщение от Замабувараев Посмотреть сообщение
придётся использовать устаревший select.
Есть еще poll/WSAPoll, например.


Цитата Сообщение от Skymotion Посмотреть сообщение
не совсем понял вашу идею
Посмотрите что-то подобное:
https://gist.github.com/Alexey... ver-c-L279
1
12.09.2022, 16:33

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
WSAPoll
с ним на винде проблемы вроде как; причем нерешаемые.
Имхо, лучше IOCP для винды ничего нет.

0
10 / 8 / 2
Регистрация: 02.12.2018
Сообщений: 142
12.09.2022, 18:26  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
придётся использовать устаревший select.
Хорошо, я понял. А я могу НЕ использовать select и при этом обеспечить корректную работу своего сервера?

Добавлено через 9 минут
Croessmah, все равно мне придется перебирать циклом этот массив, что будет занимать время, но все же это более разумное решение.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.09.2022, 19:05
Цитата Сообщение от Skymotion Посмотреть сообщение
А я могу НЕ использовать select
Если вы можете не использовать select, то лучше сразу использовать IOCP.
0
10 / 8 / 2
Регистрация: 02.12.2018
Сообщений: 142
12.09.2022, 19:13  [ТС]
Замабувараев, если все же поступать таким образом, мне придется использовать ОС Windows, ибо в принципе с самим linux я не особо знаком, тем более с его специфичными возможностями в API.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
12.09.2022, 19:29
Лучший ответ Сообщение было отмечено Skymotion как решение

Решение

Цитата Сообщение от Skymotion Посмотреть сообщение
они сильно сломают кроссплатформенность.
Свой http-сервер менее чем в 40 строк кода на libevent и C++11

Цитата Сообщение от Skymotion Посмотреть сообщение
что будет занимать время
Цитата Сообщение от Skymotion Посмотреть сообщение
Представим, что имеется сервер, на который могут приходить сотни подключений в секунду.
Это много для человека, а для сервера - пыщ и уже всё обработано.
Решайте проблемы с производительностью тогда, когда наступят эти проблемы, а то вы рискуете так ничего и не сделать в погоде за супер-скоростью, которая может даже и не потребуется.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.09.2022, 14:20
*в погоне.
Совсем старый стал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.09.2022, 14:20
Помогаю со студенческими работами здесь

Создать свой собственный шрифт для редактора формул
Здравствуйте)))Решил сделать шрифт под свой почерк, со шрифтом обычным разобрался. А вот для редактора формул не очень , мне нужны самые ...

Создайте свой собственный модуль для работы с комплексными числами.
Создайте свой собственный модуль для работы с комплексными числами. (сложение, вычитание, умножение).

Создайте свой собственный модуль для работы с обыкновенными дробями
Создайте свой собственный модуль для работы с обыкновенными дробями. (сокращение, сложение, вычитание, умножение, деление, сравнение).

Как создать свой собственный компонент для rad studio?
Доброго времени суток. Столкнулся с проблемой создания собственных компонентов, так как понятия не имею с чего начать. Подскажите...

Выбор языка для программ, анализирующих и меняющих свой же собственный код
Посоветуйте язык программирования сверхвысокого уровня (ЯПСВУ), программа на котором могла бы в COMPILE TIME обрабатывать и изменять свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru