Что лучший способ состоит в том, чтобы реализовать межплатформенный, многопоточный сервер в C/C++?

Поскольку вы используете jQuery, как я видел в вашем коде, вы можете легко использовать любой из плагинов jQuery (или jQuery UI), чтобы иметь модальное или диалоговое окно, которое загружает содержимое вашего Privacy and Cookie Policy, я имею в виду, как только пользователь нажимает на #my_link

https://jqueryui.com/dialog/




  
  
  jQuery UI Dialog - Default functionality
  
  
  
  
  



This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.

10
задан William Brendel 20 December 2008 в 14:39
поделиться

11 ответов

Я использовал Повышение. Поток и Повышение. Asio для создания многопоточного сервера в системах Windows & Linux. Учебные руководства помогли начать.

13
ответ дан 3 December 2019 в 13:48
поделиться

Я использовал бы QT. Это имеет межплатформенную поддержку поточной обработки. Хорошая документация:

Документация поточной обработки QT

Их сигнал/слот, передающий механизм, работает беспрепятственно между потоками также.

4
ответ дан 3 December 2019 в 13:48
поделиться

Едва ли ответ на Ваш вопрос, но так как это походит на Вас, на самом деле более знаком с Java, чем C/C++, почему бы не продолжить Вашу ссылочную реализацию, и соединяется с SDK с помощью Собственного Интерфейса Java. (Я никогда действительно использовал его, но я полагал, что это будет полезно точно для этих видов ситуаций.)

С другой стороны, Вы могли легко записать простую программу C, которая использует SDK и затем отправляет данные в Вашу программу Java, с помощью основанных на сокете потоков, например. Таким образом, Вы могли снова обработать более трудный материал в Java.

4
ответ дан 3 December 2019 в 13:48
поделиться

Лучший способ записать такой сервер не состоит в том, чтобы записать один, и повторно спроектировать Вашу систему, таким образом, это не необходимо, и/или снова использовать компоненты, которые уже существуют. Поскольку:

Кто-то подключил бы устройство датчика к их машине в одной части здания и выполнил бы наш сервер, таким образом совместно использовав устройство (устройства) с остальной частью сети.

Это также имеет потенциал для совместного использования всей машины с отдыхом сети, если код имеет уязвимость (который это, вероятно, будет, поскольку Вы пишете это в C++ с нуля и изобретаете новый протокол).

Так, сделайте это наоборот. Установите простой клиент на машине, которая имеет аппаратные средства датчика, затем выполняет их или все время, или периодически, и имеет их нажатие (сообщение) результаты к центральному серверу. Центральный сервер мог даже быть стандартным веб-сервером. Или это могла быть база данных. (Заметьте, что оба из них уже были записаны - никакая потребность изобрести велосипед ;-)

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

Даже если Вам нужен набор данных реального времени (и из Вашего описания он кажется, что Вы не делаете), это все еще может быть лучше для коллектора датчика быть клиентом и не сервером. Позвольте ему открыть долговечное соединение с центральным коллектором (или группа их) и ждать инструкций обеспечить ее данные.

править: ceretullis и ответы pukku предлагают, чтобы хорошая вариация на эту многоадресную передачу использования - видела этот ответ и комментарии

9
ответ дан 3 December 2019 в 13:48
поделиться

ACE Douglas Schmidt (Адаптивная коммуникационная среда) является сформировавшийся,очень портативныйплатформой открытого исходного кода для создания высокоэффективных многопоточных серверов. Это главным образом нацелено на телекоммуникационные приложения, но использовалось для множества проектов. Это также идет с посредником запросов к объектам под названием ДАО (если Вы в CORBA),

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

Существует довольно мало электронной документации и также несколько книг, записанных об этом. Это не является самым теплым и пушистым из систем и действительно создается для скорости, а не комфорта - но мы используем C++. Вы, вероятно, найдете, что это - намного меньше усилия получить Вашу голову вокруг ACE, чем попытка восстановить функциональность и отладить всю синхронизацию.

О, и между прочим, это свободно как в речи - и как в пиве. Если Вы хотите к коммерческому маршруту существует также экосистема консультантов, которые окажут поддержку и услуги по менторству для нее. Учебное руководство с некоторыми фрагментами кода может быть найдено здесь.

7
ответ дан 3 December 2019 в 13:48
поделиться

Я соглашаюсь с frankodwyer, зеркально отражаю протокол от модели приема до модели передачи.

Имейте компьютер с подключенным датчиком, широковещательно передает чтения по многоадресной передаче UDP на уровне 100 Гц (или независимо от того, что делает с тех пор для Ваших датчиков) каждый раз, когда услуга совместного использования работает. Затем запишите клиентам, которые считывают многоадресные данные.

Кроме того, Вы могли использовать, широковещательно передает UDP вместо многоадресной передачи.

BTW, это - то, сколько GPS, Лазерный локатор и другие датчики делают вещи.

1
ответ дан 3 December 2019 в 13:48
поделиться

Я также хотел бы рекомендовать Инструментарий Распространения, который (согласно веб-сайту проекта) является "инструментарием с открытым исходным кодом, который обеспечивает высокопроизводительную службу обмена сообщениями, которая эластична к отказам через локальные сети и глобальные вычислительные сети". Я использовал его несколько раз в ситуациях, которые звучат очень похожими на Ваш. По существу это дает Вам сервер, который предлагает frankodwyer.

Демон Распространения (т.е. сервер) не является многопоточным, но это действительно быстро и масштабируется хорошо, по крайней мере, до сотен или тысяч клиентов. Кроме того, протокол обслуживает надежную многоадресную передачу IP, которая (в мультиклиентской среде) может дать Вам (мудрый производительностью) определенный край против чего-либо реализованный использующий TCP точка-точка или соединения UDP только. (Но: не пытайтесь реализовать надежный IP, многоадресно передающий себя..., по-видимому, проект Распространения произвел много тезисов степени доктора философии/магистра наук как продукт стороны - или действительно ли это - инструментарий, который является продуктом стороны, в то время как основной акцент всегда был научным исследованием? Я действительно не знаю...).

Так как Распространение имеет C и клиентские API Java (плюс Python), это походит на очень хорошее соответствие к Вашей проблеме. У них есть две модели лицензирования; первая альтернатива близко к BSD's. И это является межплатформенным, конечно (и относительно клиента и относительно сервера).

Однако Распространение (конечно), не сделает всего для Вас. Наиболее заметно, возможно, это не делает персистентности (т.е. если Ваш клиент будет в режиме офлайн или в других отношениях не мочь получить сообщения, то Распространение не буферизует их вне очень небольшого количества msgs, по крайней мере). Но к счастью это не действительно слишком трудно к реализации персистентности самокрутки сверху того, что гарантирует Распространение (хорошо, я даже не знаю, важна ли такая проблема для Вас, или не). Во-вторых, Распространение ограничивает Ваши сообщения 100 килобайтами каждый, но тот предел также довольно легко обойти просто, заставляя отправителя прервать большое сообщение во многие меньшие и затем связывая их в получателе.

3
ответ дан 3 December 2019 в 13:48
поделиться

Используйте Межплатформенный API или Создайте Ваш собственный API, который Вы изменяете на каждой Архитектуре.

Также пересмотрите это: http://www.goingware.com/tips/getting-started/

0
ответ дан 3 December 2019 в 13:48
поделиться

Если Вы хотите использовать C (и не C++), библиотека NSPR могла бы обеспечить то, в чем Вы нуждаетесь...

0
ответ дан 3 December 2019 в 13:48
поделиться

Я настоятельно рекомендую, чтобы Вы рассмотрели опытный шаблон разработки.

Я использовал этот шаблон для записи сервера агностика протокола в C++, который я использовал для всего от веб-сервисов HTTP до пользовательских собственных протоколов двоичной синхронной передачи данных.

В основном идея - это:

Сервер заботится о, принимают (), что входящие соединения луга на конкретном порте и создающих потоках (или процессы) обрабатывают те соединения.

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

Создайте класс "ConnectionHandlerBase" с чистым "HandleConnection () = 0" методов. Заставьте пользователей класса сервера разделить этот класс на подклассы со своей собственной реализацией. Кроме того, этот класс реализует "Клон ()" метод, который возвращает копию себя... Таким образом, сервер может создать новые экземпляры его, не будучи должен знать его тип... Затем, когда Вы получаете соединение, назовите "Клон ()" на Вашем формирующем прототип экземпляре и имейте вызов потока обработки "HandleConnection ()" на этом объекте.

При запуске приложения пользователь класса сервера должен назвать что-то вроде этого:

"Сервер. AttachConnectionPrototype (&MyConnectionObject)";

-2
ответ дан 3 December 2019 в 13:48
поделиться

Я использую libevent для мультиплексирования сетевого ввода-вывода. Вы должны рассматривать его как альтернативу Boost.Asio.

Libevent API предоставляет механизм для выполнения функции обратного вызова, когда в файловом дескрипторе происходит определенное событие или по истечении времени ожидания. В настоящее время libevent поддерживает / dev / poll, kqueue, порты событий, select, poll и epoll.

2
ответ дан 3 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: