Отправить одну и ту же информацию в несколько тем / сокетов? - PullRequest
0 голосов
/ 01 января 2012

Я пишу серверное приложение, которое просто подключает локальный последовательный порт к нескольким клиентам, подключенным к сети. Я использую Linux и C для серверного приложения, потому что оборудование для программы - маршрутизатор с ограниченной памятью.

У меня есть все настройки для подключения нескольких клиентов и отправки данных на последовательный порт с использованием процесса fork () для каждого подключения.

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

Ответы [ 3 ]

1 голос
/ 01 января 2012

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

0 голосов
/ 01 января 2012

Поток на каждый сокет может быть не лучшим способом решить эту проблему.Асинхронный подход, управляемый событиями, должен подходить гораздо лучше.Однако, если вы должны сделать это с потоками, и учитывая, что последовательные порты все равно медленные, построение канала между потоком, слушающим последовательный порт, и всеми потоками, обращающимися к сетевым клиентам, является наиболее практичным.С rwlocks вы могли бы делать причудливые вещи для перемещения данных, но вам все равно понадобится способ, чтобы сетевые потоки ожидали как на сокете, так и на данных от последовательного порта, поэтому вам нужно использовать файловые дескрипторы для обоих и что-то вродеpoll.

А если серьезно, это, вероятно, будет намного проще и будет работать лучше без потоков.Думайте об этом как о главном цикле, который ожидает в опросе, который наблюдает за сетью и последовательным портом, определяет, какое событие произошло, и соответственно распределяет данные.Как только у вас появится идея, должно быть все вокруг.

0 голосов
/ 01 января 2012

Предположительно, у вас есть список или какая-либо другая ссылка на / на подключенных клиентов, почему бы просто не повторить цикл для каждого бита информации и отправить его всем им?

...