Я разрабатываю Data Distributor (например, генерирую произвольное число), где он будет обслуживать несколько клиентов.
Клиент C сначала отправляет список номеров, в которых он заинтересован DD по TCP, и прослушивает данные по UDP. Через некоторое время (несколько минут) клиент может обновить свой список подписки, отправив больше номеров в DD.
Я могу это сделать двумя способами.
ПЕРВЫЙ:
New_Client_Connected_Thread(int sock_fd)
{
--Get Subscription
--Add to UDP Publisher List
--close(sock_fd)
}
Каждый раз, когда клиент хочет подписаться на новый набор данных, он установит новое TCP-соединение.
ВТОРОЙ:
New_Client_Connected_Thread(int sock_fd)
{
while(true)
{
--wait for new subscription list
--Get subscription
--Add to UDP Publisher List.
}
}
Здесь потребуется только одно TCP-соединение на одного клиента.
Однако, если клиент не отправляет новый запрос, Client_Thread будет ждать ненужного в течение длительного времени.
Учитывая, что мой Дистрибьютор данных будет обслуживать множество клиентов, которые из них, по-видимому, являются эффективным способом?
Libevent или libev, который поддерживает цикл, управляемый событиями, вероятно, более подходит для части TCP этого.
Вы можете избежать потоковой передачи и иметь один цикл для части TCP, чтобы добавить своих клиентов в список издателей. Libevent очень эффективен при управлении партиями и множеством подключений и разрывов сокетов в секунду и используется такими вещами, как Tor (луковый маршрутизатор)
Похоже, что TCP-соединение в вашем приложении больше связано с соединением "Control Plane", и, следовательно, оно, вероятно, будет зависеть от того, как часто ваши клиенты должны "контролировать" ваш сервер, который собирается принять решение о том, следует ли оставить сокет открытым или закрыть его после контроля. Имейте в виду, что одновременное сохранение тысяч TCP-соединений постоянно открывает его ресурс ядра на хосте, но при других подключениях открытия и закрытия все время вводит некоторую задержку из-за времени настройки соединения.
См. Https://github.com/libevent/libevent/blob/master/sample/hello-world.c на примере сервера libevent TCP.
Поскольку вы кодируете в C++, вам, вероятно, будет интересна оболочка http://llucax.com.ar/proj/eventxx/ для libevent