powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Высоко-нагруженный сервер на ubuntu - С++ под Linux
32 сообщений из 32, показаны все 2 страниц
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525176
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

У меня стоит задача написать сервер на c++ под linux используя сокеты. Собственно, я его написал. Сейчас он выполняет следующие задачи: отправляет и принимает сообщения и файлы на клиенты и от них. Для поддержания множества клиентов использую потоки. Первый поток ожидает подключения новых клиентов. Далее для каждого нового клиента создаются два новых потока: первый для чтения сообщений от клиента, второй для отправки ему сообщений. Все работает замечательно. Но, так как сервер должен поддерживать не пару клиентов, а очень много (допустим 1000 и более), то я предполагаю, что это не лучшая реализация сервера. Поэтому у меня возник вопрос: как должен выглядеть высоко-нагруженный сервер. Сейчас есть вариант использовать библиотеку libevent. Буду рад любым идеям.

Спасибо!
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525178
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант взять готовое например тут
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525194
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть библиотека ZMQ , по сути надстройка над TCP для обмена сообщениями. Бесплатная, кроссплатформенная. Быстрая и легкая. Вся логика для обслуживания большого количества соединений прописана внутри.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525694
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La Franceдля каждого нового клиента создаются два новых потока: первый для чтения
сообщений от клиента, второй для отправки ему сообщений.
А зачем для отправки сообщений отдельный поток-то?..

Обслуживай несколько коннектов (до 10) одним потоком с помощью select() или её производных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525751
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поток на каждое соединение - это не масштабируется на большое число соединений.
Нужна архитектура, где небольшое число потоков (к примеру равное числу процессоров) обслуживают каждый большое число соединений.
Тут как бы неминуемо приходим к асинхронному выполнению операций над сокетами, что предусматривает разбиение логики программы на множество колбэков - приготовьтес к этому, код станет запутанней чем с потоками, это плата за масштабируемость.
Соответственно нужно выбрать библиотеку которая в полной мере поддерживает асинхронность и многопоточность.

libevent - хороший выбор, если у вас на чистом С приложение.

Если же у вас С++, то рекомендую не заморачиваться и использовать Boost.Asio
Вот пример простого ECHO сервера на нем
http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cpp
Там один поток, но несложно переделать в несколько потоков, чтобы использовать все ресурсы сервера.

Вот полноценный HTTP сервер, который уже с потоками
http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/http/server2/
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525804
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyПоток на каждое соединение - это не масштабируется на большое число соединений.
Нужна архитектура, где небольшое число потоков (к примеру равное числу процессоров) обслуживают каждый большое число соединений.
Тут как бы неминуемо приходим к асинхронному выполнению операций над сокетами, что предусматривает разбиение логики программы на множество колбэков - приготовьтес к этому, код станет запутанней чем с потоками, это плата за масштабируемость.
Соответственно нужно выбрать библиотеку которая в полной мере поддерживает асинхронность и многопоточность.

libevent - хороший выбор, если у вас на чистом С приложение.

Если же у вас С++, то рекомендую не заморачиваться и использовать Boost.Asio
Вот пример простого ECHO сервера на нем
http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cpp
Там один поток, но несложно переделать в несколько потоков, чтобы использовать все ресурсы сервера.

Вот полноценный HTTP сервер, который уже с потоками
http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/http/server2/
А в Boost.Asio до сих пор используются обычная MP-MC очередь на mutex, для распределения дескрипторов "готовых" сокетов полученных при демультиплексировании select/kqueue/epoll - не поставили туда ещё boost::lockfree::queue<>, который быстрее в 2 раза, или не сделали там возможность настройки пакетного распределения - batch-инга?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38525831
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Если использовать схему "один io_service - один поток", то неважно какая там очередь, потоки не конкурируют между собой, а замыкание мютекса при отсутствии конкуренции это и есть lock-free :)
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526214
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася Уткин,

Если использовать схему "один io_service - один поток", то неважно какая там очередь, потоки не конкурируют между собой, а замыкание мютекса при отсутствии конкуренции это и есть lock-free :)
А это оптимальная схема с точки зрения производительности - на один порт вешать несколько io_service-ов, и использовать на каждый "один io_service - один поток"?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526254
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинА это оптимальная схема с точки зрения производительности - на один порт вешать несколько io_service-ов, и использовать на каждый "один io_service - один поток"?
Ну, на один порт не повесишь несколько сервисов.
Там висит один отдельный сервис+поток, и он уже равномерно раскидывает новые соединения по пулу сервисов.
Т.е. конкуренция между потоками есть - в момент создания нового соединения, но это имеет несущественное значение, т.к. основная работа с сервисом происходит все-таки в одном потоке и плюс конкурируют не более чем 2 потока.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526261
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТам висит один отдельный сервис+поток, и он уже равномерно раскидывает новые соединения по пулу сервисов.
Кстати такая схема позволяет отказаться от асинхронности в коде accept - синхронный вариант быстрее работает, т.к. нет очереди, и связанного с ней оверхеда.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526366
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинА это оптимальная схема с точки зрения производительности - на один порт вешать несколько io_service-ов, и использовать на каждый "один io_service - один поток"?
Ну, на один порт не повесишь несколько сервисов.
Там висит один отдельный сервис+поток, и он уже равномерно раскидывает новые соединения по пулу сервисов.
Я так понимаю это - "отдельный сервис+поток, и он уже равномерно раскидывает новые соединения по пулу сервисов" скрыто за самой библиотекой Boost.Asio.
А в моем коде будет выглядеть именно как несколько сервисов на одном порту?

Anatoly MoskovskyТ.е. конкуренция между потоками есть - в момент создания нового соединения, но это имеет несущественное значение, т.к. основная работа с сервисом происходит все-таки в одном потоке и плюс конкурируют не более чем 2 потока.
В смысле, какие 2 потока конкурируют, если и сервис и обработчик в одном потоке?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526414
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинЯ так понимаю это - "отдельный сервис+поток, и он уже равномерно раскидывает новые соединения по пулу сервисов" скрыто за самой библиотекой Boost.Asio.
А в моем коде будет выглядеть именно как несколько сервисов на одном порту?

Нет. В явном виде отдельный поток выполняющий accept.
В смысле, какие 2 потока конкурируют, если и сервис и обработчик в одном потоке?
Конкурирует поток accept попарно с N потоков пула сервисов обрабатывающих дальнейшие после accept события.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526540
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

можно привести пример передачи сокета в другой io_service?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526849
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sherzod_Anatoly Moskovsky,

можно привести пример передачи сокета в другой io_service?
http://alexott.net/ru/cpp/BoostAsioNotes.html
автор test-mcmt.cpp — реализует обработку данных в соответствии со стратегией Many Connections/Many Threads: запускается несколько нитей выполнения, которые по очереди принимают соединение и обрабатывают запросы в асинхронном режиме;
Из начала очереди io_service переставляется в конец, по принципу round-robin: https://github.com/alexott/boost-asio-examples/blob/master/test-mcmt.cpp#L130

В потоке акцептора создается сокет в составе объекта connection, который передается текущему io_service: https://github.com/alexott/boost-asio-examples/blob/master/test-mcmt.cpp#L133
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38526906
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКонкурирует поток accept попарно с N потоков пула сервисов
обрабатывающих дальнейшие после accept события.
А за какой ресурс они конкурируют?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527073
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_можно привести пример передачи сокета в другой io_service?
Новый сокет изначально создается с нужным сервисом. Просто пока не пройдет accept никакие обработчики этого сокета не вызываются (сокет вообще изначально пустой, только после accept он инициализируется и для него вызывается async_rea/async_write).
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527084
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly MoskovskyКонкурирует поток accept попарно с N потоков пула сервисов
обрабатывающих дальнейшие после accept события.
А за какой ресурс они конкурируют?
Поток accept добавляет хендлер в очередь одного из сервисов в пуле, дальше все хендлеры добавляются уже из потока этого же сервиса. Т.е. конкуренция идет за очередь сервиса в момент accept.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527165
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyПоток accept добавляет хендлер в очередь одного из сервисов в пуле, дальше все хендлеры добавляются уже из потока этого же сервиса. Т.е. конкуренция идет за очередь сервиса в момент accept.
Anatoly MoskovskyТ.е. конкуренция между потоками есть - в момент создания нового соединения, но это имеет несущественное значение, т.к. основная работа с сервисом происходит все-таки в одном потоке и плюс конкурируют не более чем 2 потока.
Но ведь в случае с web-сервером, например, каждый вызов страницы - это открытие и закрытие нового соединения. А если на web-сервере страницы статичные и быстро создаются, то нельзя сказать, что "основная работа с сервисом происходит все-таки в одном потоке" по сравнению с засыпанием acceptor-a на мьютексе и ожидания пока он снова проснется, ведь пока acceptor спит ни одно новое соединение не может быть создано.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527242
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинНо ведь в случае с web-сервером, например, каждый вызов страницы - это открытие и закрытие нового соединения.


Вовсе не обязательно. Есть keep-alive.

Вася Уткин А если на web-сервере страницы статичные и быстро создаются, то нельзя сказать, что "основная работа с сервисом происходит все-таки в одном потоке" по сравнению с засыпанием acceptor-a на мьютексе и ожидания пока он снова проснется, ведь пока acceptor спит ни одно новое соединение не может быть создано.

Переведи ...
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527312
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivВася УткинНо ведь в случае с web-сервером, например, каждый вызов страницы - это открытие и закрытие нового соединения.


Вовсе не обязательно. Есть keep-alive.

Вася Уткин А если на web-сервере страницы статичные и быстро создаются, то нельзя сказать, что "основная работа с сервисом происходит все-таки в одном потоке" по сравнению с засыпанием acceptor-a на мьютексе и ожидания пока он снова проснется, ведь пока acceptor спит ни одно новое соединение не может быть создано.

Переведи ...
Что непонятно, что эта очередь на мьютексе?Anatoly Moskovsky Поток accept добавляет хендлер в очередь одного из сервисов в пуле...
Или что поток accept может на этом мьютексе заснуть (переключится контекст в ожидании освобождения мьютекса)?
Или что поток accept ожидающий мьютекса не может принимать соединения?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527376
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Я в упор тебя не понимаю.

Этот accept ?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
(или его POSIX-аналог)

Почему он должен висеть на мьютексе ?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527399
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivВася Уткин,

Я в упор тебя не понимаю.

Этот accept ?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
(или его POSIX-аналог)

Почему он должен висеть на мьютексе ?
Потому что надо читать сначала - мы говорим про Boost.Asio :) и в нем вызов async_write/async_read - это добавление хендлера в мьютексную очередь. Мы говорим не про функцию accept, а про весь поток-acceptor, который создает сокет, вызывает accept и отдает этот сокет в один из потоков в пуле.

Anatoly Moskovsky Поток accept добавляет хендлер в очередь одного из сервисов в пуле...
Когда Поток accept вызывает async_write/async_read - добавляет в мьютексную очередь, а один из сервисов в одном из потоков из пула потоков читает из этой очереди в хендлер для исполнения, что происходит?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527420
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Не, эт я не понимаю. Эт к Анатолию.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527495
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Вопросы увидел - отвечу позже, счас некогда вдумываться.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527560
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему так всё просто:

Висишь на select-е (или poll/epoll) . Владеешь всеми хендлерами сокетов.

select генерирует событие.

по всем сработавшим сокетам (по каждому) создаём задачу на обработке в пуле коннектов,
хватаем мьютекс очереди, пихаем задачи в очередь, отдаём мьютекс. Отдаными сокетами более не владеем.

Взводим event/semaphore, что есть задачи.

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

Если нужна новая задача, порождаемая обработкой, -- тот же механизм.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527583
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivПо-моему так всё просто:

Висишь на select-е (или poll/epoll) . Владеешь всеми хендлерами сокетов.

select генерирует событие.

по всем сработавшим сокетам (по каждому) создаём задачу на обработке в пуле коннектов,
хватаем мьютекс очереди, пихаем задачи в очередь, отдаём мьютекс. Отдаными сокетами более не владеем.

Взводим event/semaphore, что есть задачи.

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

Если нужна новая задача, порождаемая обработкой, -- тот же механизм.

Верно. На большом количестве коротких соединений оптимальнее использовать lock-free очередь вместо lock-based(mutex) очереди, но почему не используют в Boost.Asio?
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527802
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Посмотрел все, что советовали. На работе сказали делать используя libevent(. Сейчас сижу разбираюсь, появляются вопросы. Попутно смотрю еще другие варианты. Смотрел стандартные средства: fork() - в принципе будет тоже самое, что у меня уже есть; select - мне понравился вариант - не сложен в реализации, есть возможность разбить обработку большого количества клиентов в нескольких потоках, для ускорения работы. По поводу select прошу высказать ваше мнение.

Теперь вопросы по поводу libevent. Разбираю сейчас этот пример. Пока сложилось такое представление: мы просто подписываемся на три возможных события: подключение нового клиента, чтение сообщения от клиента, отправка сообщения клиенту. В таком представлении работает только подключение новых клиентов. Принимается сообщение только один раз от каждого нового клиента. Почему так происходит? Сначала подумал, после каждого чтения сообщения от клиента его нужно снова подписывать на это событие, но это вроде как глупо, да и не работает.

Буду рад, если кто-нибудь разберет этот пример и объяснит мне логику его работы.

Спасибо!
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527847
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La France,
select как раз для большого кол-ва клиентов будет плох. При каждом событии вам нужно будет пробегаться по каждому из них и смотреть есть ли данные. То есть линейное время по кол-ву сокетов.
ps. Как близкая альтернатива к libevent можно рассмотреть libev: он легче (по весу, киллограммов на 10) libevent, так же заявляется что он шустрее.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38527935
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sherzod_,

Прочитал про два варианта: fork и select в этой статье. Если допилить пример с select, так чтобы клиенты обслуживались в нескольких потоках, то будет лучше чем создавать потоки для каждого клиента, при условии, что клиентов очень много. С примером libevent, о котором говорил разобрался вроде - подписал на чтение в конце метода записи, и убрал закрытие сокета и удаление data. Сейчас пока другой пример разбираю.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38528147
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_select как раз для большого кол-ва клиентов будет плох. При каждом событии
вам нужно будет пробегаться по каждому из них и смотреть есть ли данные. То есть линейное
время по кол-ву сокетов.
Именно поэтому обычно порождают отдельный рабочий процесс на обработку каждых XX
подключений. Кроме того в современных процессорах есть команда сканирования массива бит в
поисках первого установленного, это уже не нужно делать for+if.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38528414
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас разбираю этот пример. Судя по расширению это код на C, я его использую как C++, думаю результат на C был бы такой же. Поэтому теперь просьба объяснить мне этот пример (Под вечер не получается понять его, но пусть будет на будущее)). Работает он сейчас так: запускаю сервер, он ждет клиентов. Запускаю клиента он коннектится и получает от сервера известное сообщение. Сейчас пытаюсь по аналогии написать метод для приема сообщений от клиентов, но пока не получается. Если есть у кого идеи буду рад, если поделитесь.
...
Рейтинг: 0 / 0
Высоко-нагруженный сервер на ubuntu - С++ под Linux
    #38530172
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинAnatoly MoskovskyТ.е. конкуренция между потоками есть - в момент создания нового соединения, но это имеет несущественное значение, т.к. основная работа с сервисом происходит все-таки в одном потоке и плюс конкурируют не более чем 2 потока.
Но ведь в случае с web-сервером, например, каждый вызов страницы - это открытие и закрытие нового соединения. А если на web-сервере страницы статичные и быстро создаются, то нельзя сказать, что "основная работа с сервисом происходит все-таки в одном потоке" по сравнению с засыпанием acceptor-a на мьютексе и ожидания пока он снова проснется, ведь пока acceptor спит ни одно новое соединение не может быть создано.

Даже если сервер читает запрос и просто пишет ответ из памяти, то все равно происходят следующие события затрагивающие очередь сервиса.
1) поток аксепт постит в сервис соединения обработчик старта сессии.
2) запускается чтение из сокета
3) запускается таймер для таймаута чтения
4) срабатывает обработчик чтения или таймер
5) запускается запись в сокет
6) запускается таймер для таймаута записи
7) срабатывает обработчик записи или таймер

И это минимально необходимые действия для любого надежного сервера.

Из всех этих событий только 1 выполняется в потоке аксептора, а остальные в потоке сервиса.

То есть основная работа с сервисом происходит все-таки в одном потоке :)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Высоко-нагруженный сервер на ubuntu - С++ под Linux
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]