Можно ли использовать один сокет в нескольких потоках?

407
17 февраля 2017, 03:03

Клиентское приложение на C++ передаёт на HTTP-сервер данные - идентификатор клиента (чтобы обозначить присутствие), кадры с веб-камеры (по запросу), скриншоты рабочего стола (по запросу). Если можно было бы транслировать или камеру, или дисплей, то вопрос бы не стоял, но по заданию должна быть возможность одновременной трансляции.

Через клиентский сокет клиент вещает свой ID с информацией о том, может ли он использовать камеру (не у всех она есть). При ответе сервера с запросом на трансляцию камеры, десктопа, или и всего вместе клиент создаёт отдельный поток для камеры и отдельный для десктопа, так как интервалы трансляции кадров разные (если с камеры 6 кб кадр можно слать 20-25 раз в секунду, то 300 кб дисплей не более 2-х, чтобы сеть не перегружать).

И вот у меня творческий тупик из-за возможно неполного понимания работы сокетов: Можно ли для этих потоков использовать один сокет? Объёмы данных приличные, не будут они друг другу мешать на одном сокете при Content-Transfer-Encoding: binary?

Answer 1

Не совсем понял что имеется в виду под отдельными потоками на клиенте, если поток это отдельное соединение к серверу, то у вас собственно и должно быть по сокету на конект/поток, ну а если все данные идут по одному каналу, то и нужен 1 сокет, то есть вам нужно отталкиваться от архитектуры клиента, а другого выбора то и нет. В любом случае у вас буден один мастер-сокет ждущий подключения, который будет создавать новые слэйв-сокеты на каждый конект. Если есть возможность создавать по сокету на "поток", то лучше так и делайте, select/epoll и т.п. в помощь. Среднестатистический ПК в состоянии работать с десятками тысяч сокетов одновременно, спокойно читая/отправляя гигабиты/с.

sitev_ru - что-то вы не понятное написали вообще, сколько одновременных запросов может отправлять "сайтик" зависит от браузера, по дефолту в современных браузерах это 6-8 одновременных запросов при HTTP /1.1.

Answer 2

Клиентское приложение на C++ - это socket-клиент, а HTTP-сервер - это socket-сервер. Это нормально, если несколько клиентов цепляются на один сервер...

Ответ: много socket-клиентов и один socket-сервер

P.S. Средненький сайтик можен отправлять HTTP-серверу до нескольких десятков или даже сотен запросов одновременно. Это всякие картиночки, js- скрипты и т.д.

READ ALSO
GNU C++ 4.8.4,перевод из int в char mass[]

GNU C++ 4.8.4,перевод из int в char mass[]

Имеется массив mass[] и число int qНеобходимо записать q по разрядам в массив

330
Зачем boost::asio::io_service помещать в отдельный поток?

Зачем boost::asio::io_service помещать в отдельный поток?

Задался вопросом, а зачем в данном примере io_service в разных потоках

332