Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 15.03.2016
Сообщений: 23

Linux, HTTP сервер

24.05.2016, 14:50. Показов 1685. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу HTTP-сервер на данный момент, задача по учебе, поэтому boost и прочие дополнительные библиотеки использовать не могу. Хочется, чтобы сервер умел обрабатывать параллельно множество клиентов, моментально завершать работу сервера по требованию и не допускать лишней нагрузки процессора странными циклами. Вопрос в том, как правильно работать с сокетами.
На данный момент у меня есть такой код для принятия подключений, который я запускаю в отдельном потоке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
    while (listening)
    {
        struct sockaddr addr;
        socklen_t addrLen = sizeof ( addr );
        int iResult;
        struct timeval tv = {0};
        fd_set rfds;
        FD_ZERO(&rfds);
        FD_SET(socketHandle, &rfds);
        tv.tv_sec = 1;
        iResult = select(socketHandle+1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
        if (iResult > 0)
            onClientAccepted(new TcpClient(accept(socketHandle, &addr, &addrLen)), this);
    }
Если я правильно понимаю, я имею блокирующий сокет, на котором в цикле делаю блокирующую операцию select с таймаутом в 1 секунду.
Это значит, что я получаю максимальное время ожидания в 1 секунду при попытке остановить работу сервера? Или я могу закрыть сокет из другого потока, и блокирующая операция моментально завершится?
Помогут ли мне в моей задаче неблокирующие сокеты? Я не очень хорошо понимаю, какова в данном случае выгода от того, что они сразу возвращают мне управление.
Как потом работать с клиентами: отдельный поток на каждого клиента с таким же принципом обработки (селект с таймаутом в цикле при ожидании данных), или что-то другое? Селект может принимать для обработки несколько сокетов сразу, но я не вижу реального использования.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2016, 14:50
Ответы с готовыми решениями:

Http сервер
Здравствуйте, не могу разобрать как сделать так, чтобы в строке браузера можно было открыть html файл(127.0.0.1:8/file1.html). Файл должен...

HTTP сервер на SOCK_RAW
С целью более глубокого понимания работы сети ищу исходники любого простого сервера и клиента на сырых сокетах.

Http Сервер Winsock
Обьясните пожалуйста на пальцах как его реализовать(хотя бы операцию GET).Обычные TCP сервер и клиент реализовал без проблем. Непонятно...

4
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.05.2016, 15:19
Лучший ответ Сообщение было отмечено dobroivan как решение

Решение

dobroivan, select не бывает неблокирующим во всяком случае если вы не вкладываете в это слово задание нулевого таймаута. для досрочного возврата из select попробуйте там где вы инициируете процедуру останова закрыть сервер-сокет. если вы используете select вам нет особой необходимости использовать неблокирующие сокеты. если клиенты через сервер получают доступ к одному и тому же ресурсу и сервер физически не может распараллелить обработку, то нет никакой необходимости создавать потоки. реальное использование передачи нескольких сокетов в select состоит например в том что у вас есть 10 подключенных сокетов и вы хотите знать есть ли на одном или нескольких из них входящие данные - вызываете select а потом пробегаете по множеству вычитывая данные из отмеченных сокетов. однако помните что множество имеет ограничение на размер (64).
1
0 / 0 / 1
Регистрация: 15.03.2016
Сообщений: 23
24.05.2016, 15:31  [ТС]
vxg, сервер имеет несколько независимых друг от друга ресурсов, к которым могут получать доступ клиенты, поэтому распараллеливание в данной задаче имеет смысл.
select на нескольких сокетах сразу и последующая независимая (= в разных потоках) обработка каждого из отмеченного сокета эффективнее чем изначально независимые селекты на каждом из сокетов?
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.05.2016, 15:36
Цитата Сообщение от dobroivan Посмотреть сообщение
select на нескольких сокетах сразу и последующая независимая (= в разных потоках) обработка каждого из отмеченного сокета эффективнее чем изначально независимые селекты на каждом из сокетов?
к сожалению не обладаю точной информацией по такому вопросу. логически напрашивается вывод о том что селект для нескольких эффективнее нескольких селектов

Добавлено через 1 минуту
...но если ваше приложение изначально построено на выделении потока для каждого сокета то при такой схеме оно будет иметь сложную архитектуру - пинать из потока сокеты в селект который лежит где-то еще и потом оттуда забирать - брр
1
0 / 0 / 1
Регистрация: 15.03.2016
Сообщений: 23
24.05.2016, 15:51  [ТС]
vxg, да, тоже подумал о том, что архитектура станет страшной. Код в бой вряд ли когда-то пойдет, так что для учебной задачи не буду заморачиваться с производительностью и остановлюсь на отдельном селекте на каждом сокете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2016, 15:51
Помогаю со студенческими работами здесь

Как передавать изображение по http на сервер?
изображение по http на сервер (сайт) нужно в формате Base64 передавать?? Добавлено через 1 минуту только так а массив байтов никак...

Параллельный TCP сервер linux
Попробовал реализовать параллельный TCP сервер с созданием потоков по запросам. Все компилируется, запускается, но сообщения не передаются....

Клиент/сервер - перенести с linux на windows
Есть клиент серверное приложение написанное для ОС linux Сервер #include <iostream> #include <string.h> #include...

Пробую написать простой сервер на Linux. Не запускается
Пытаюсь учить сети под линукс. У меня Mint 17, Возможно запуск программы делаю неправильно. Всё компилируеся. Пытаюсь через консоль...

Как переписать клиент-сервер Windows под linux?
написала программу клиент-сервер в VS под Windows. как сделать чтобы она запускалась и под linux? уже поставила ubunta на виртуальную...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru