2015-08-20 2 views
0

У меня возникли проблемы с синхронизацией потоков и сокетов. Мне нужен один поток, чтобы получать входящие соединения в сокете (и помнить данные клиента для ответа) и другой поток для установки фреймов и отправки текущего кадра указанным клиентам. Поэтому мне было интересно, может ли его (kinda) поместить мои кадры данных в серверный сокет, чтобы каждый мог просто читать текущий кадр из сокета без знания сервера.источник данных emiter C++

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

В настоящее время я делаю это довольно перепутались путь, который я не люблю:

  • сервер прослушивает один поток для входящих передач и при reciving таких, добавить данные клиента в список.
  • на другом потоке сервер отправляет данные всем клиентам из списка.

EDIT:

Я хочу, чтобы отправить данные в какой-то буфер, из которого клиенты могут читать. (клиент не должен читать все сообщения сервера отправляет, только один буфер содержит в момент запроса клиентов), я не хочу, чтобы сервер даже заметил, что клиенты читают из буфера, если это возможно.

Сейчас нити syncronised с помощью uniqe_lock

+0

Трудно прочитать ваш вопрос: пытаетесь ли вы передавать одни и те же данные нескольким клиентам и хотите отправить их один раз для всех, а не повторно для каждого? – ams

+0

Не могли бы вы предоставить [mvce] (http://stackoverflow.com/help/mcve)? –

+0

Прежде чем думать о сроках сокетов, опишите, что вы хотите. До сих пор я понял, что: 1. клиент подключается к серверу и говорит, что ему нужны данные 2. сервер готовит кадр для этого клиента 3. клиент возвращается, чтобы прочитать свои собственные данные. Что я не мог догадаться: как идентифицировать клиента (они?) По IP? по id? Читают ли они свои данные или все данные или последние данные (то же самое для всех клиентов). Это не должно быть сложно спроектировать ... как только мы узнаем, что ожидается! –

ответ

0

То, что вы описываете, это, вероятно, MultiCast. В частности, IP MultiCast (я думаю).

Поиск находит ряд полезных ресурсов. This one выглядит кратким и включает в себя кодированные примеры (хотя я не уверен, насколько это актуально).

Если вы только передаете в ЛВС, тогда трансляция также будет работать.

+0

Мне нужно передать через интернет – Cynizm

+0

Тогда MultiCast это. – ams

+0

прямо сейчас, используя протокол UDP, но серверу все равно нужно восстановить начальное сообщение от клиента, чтобы добавить клиента в список. Я хочу обойти этот шаг. Я не знаю, как избежать итерации списка. – Cynizm

Смежные вопросы