Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: TCP-Server (LibEvent)  (Прочитано 1087 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hound672

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
TCP-Server (LibEvent)
« : 11 Апреля 2015, 14:15:29 »
Добрый день. Имеем:
1-ый поток - TCP сервер на Си с LibEvent.
2-ой поток обработка очередей и отправка обработанных данных на другой сервер.

Сишный сервер принимает сообщения от неких устройств и обрабатывает их (грубо говоря каждое устройство имеет свой уникальный идентификатор), дальше складывает их в очередь (queue.h).

Второй поток в постоянном цикле смотрит на наличие данных в очереди и если они есть передает их в стороний сервис и ждет от него ответа:
либо просто "OK\r\n",
либо если есть для данного устройства сообщения, то отправляет их обратно в сишный сервер. Так вот вопрос, как лучше реализовать отправку сообщений полученных от стороннего сервиса устройству?

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

Кто-нибудь реализовывал подобное? Кто что может подсказать?

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #1 : 11 Апреля 2015, 17:05:34 »
Кто-нибудь реализовывал подобное? Кто что может подсказать?

Сотню раз ;-)

много серверов хороших и разных

Оффлайн hound672

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #2 : 11 Апреля 2015, 17:09:06 »
Olej, а подробнее можно?) В частности из того, что я написал как реализовать?

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #3 : 11 Апреля 2015, 17:12:34 »
Olej, а подробнее можно?) В частности из того, что я написал как реализовать?


Я же вам написал ссылку? - берите скачивайте, читайте. Там есть просто архив образцов нужного вам кода.

И ещё вот это: Передача сообщений TCP/IP.
Это то, на чём сшибаются все, начинающие писать TCP: в TCP нет сообщений.

Оффлайн hound672

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #4 : 11 Апреля 2015, 17:24:31 »
Olej,
Да сам сервер то есть и он работает, данные принимает - отправляет с этим все хорошо. Тут вопрос в том, как реализовать внеочередную отправку пакета клиенту.
В общем, основной сервер (Си + либэвент) получил пакет от клиента - разобрал его положил в очередь, другой поток этого приложения забрал эти данные из очереди и отправил стороннему сервису , тот сервис смотрит в базе данные к отправке для клиента и если они есть отправляет их обратно.
И вот сишный сервер получив от стороннего сервиса данные к отправке должен отправить их нужному клиенту и желательно сразу после получения. Но т.к это делается это в другом потоке и в очередь складывается только уже разобранные данные, то ссылки на клиента нет.
Хотя если в очередь данных добавлять еще ссылку на клиента (struct bufferevent*), то в теории получится сразу же отправлять данные, но тогда есть риск того, что клиент уже отключился а мы пытаемся ему данные пихнуть. Да и сам вариант использования объектов libevent'a в разных потоках кажется мне не совсем корректным, или я не прав?

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

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #5 : 11 Апреля 2015, 17:52:48 »
В общем, основной сервер (Си + либэвент) получил пакет от клиента - разобрал его положил в очередь, другой поток этого приложения забрал эти данные из очереди и отправил стороннему сервису , тот сервис смотрит в базе данные к отправке для клиента и если они есть отправляет их обратно.
И вот сишный сервер получив от стороннего сервиса данные к отправке должен отправить их нужному клиенту и желательно сразу после получения. Но т.к это делается это в другом потоке и в очередь складывается только уже разобранные данные, то ссылки на клиента нет.
Хотя если в очередь данных добавлять еще ссылку на клиента (struct bufferevent*), то в теории получится сразу же отправлять данные, но тогда есть риск того, что клиент уже отключился а мы пытаемся ему данные пихнуть. Да и сам вариант использования объектов libevent'a в разных потоках кажется мне не совсем корректным, или я не прав?
Идея ваша с очередью и 2-мя потоками представляется вовсе не хорошей ... громоздкой и кондовой:
- замучитесь с синхронизациями доступа к очереди "производитель-потребитель"...
- при том, что непонятно какого выигрыша хотите добится.

Оффлайн hound672

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #6 : 11 Апреля 2015, 17:55:22 »
Olej,
хорошо, а как реализовать без двух потоков? Отправлять обработанные данные и ф-ции колбека либэвента? А если стороний сервис затормозит? или вдруг он отвалился? А так в отдельном потоке постоянно проверяется наличие связи с этим сервисом и в случае чего происходит переподключение.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: TCP-Server (LibEvent)
« Ответ #7 : 11 Апреля 2015, 18:05:42 »
хорошо, а как реализовать без двух потоков? Отправлять обработанные данные и ф-ции колбека либэвента? А если стороний сервис затормозит? или вдруг он отвалился? А так в отдельном потоке постоянно проверяется наличие связи с этим сервисом и в случае чего происходит переподключение.

Непосредственно ретранслировать данные по получению. В стеке TCP/IP есть свои очереди.
Как вариант: создавайте поток динамически под запрос нового клиента, а когда всё отработаете - завершать поток. Пул потоков, в конце концов.

 

Страница сгенерирована за 0.015 секунд. Запросов: 21.