2015-06-26 4 views
2

Мы разрабатываем сервер DDP на языке C (не спрашивайте, почему - нам просто нужно). Мы заметили, что Meteor использует SockJS для реализации протокола DDP. Хотя есть библиотеки, которые позволяют мне делать веб-сокеты в C, я не нашел никаких библиотек SockJS для C.DDP-сервер в C

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

Это заставило меня подумать, какие лучшие стратегии помогут нам поддерживать DDP. Есть несколько вариантов, я могу думать:

  1. я мог бы импортировать двигатель V8 и использовать его, чтобы соединить между C++ и реализации JavaScript (который я тогда мог выставить С относительно легко)
  2. я мог бы использовать SockJS библиотеку X для языка Y и использовать Python/C/JNI/... для взаимодействия с этим
  3. Возможно, я мог бы заставить Meteor использовать только веб-сокеты (DDP-документы, похоже, предполагают, что это возможно, но я не мог понять как).

Вариант 3, если вообще возможно, будет наименьшим усилием, но наследует проблемы с помощью WebSockets (совместимость с браузером, корпоративные брандмауэры и т. Д.).

Варианты 1 и 2 осуществимы, но размер библиотеки, которую я должен включить, чувствует несоразмерность функциональности, которую я буду использовать.

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

+0

ДДП кнопку [Distributed данных протокола] (https://en.wikipedia.org/wiki/Distributed_Data_Protocol), ДДП кнопку [ Протокол передачи дейтаграмм] (https://en.wikipedia.org/wiki/Datagram_Delivery_Protocol) или какой-либо другой DDP? – duskwuff

+0

как насчет этого для начала? http://stackoverflow.com/questions/27224164/etablish-ddp-connection-between-meteor-server-and-c-app –

+0

JD_GRINDER - Я заметил этот вопрос, обратите внимание, что это касается клиента DDP, а не сервера. Однако он предполагает, что реализация DDP Meteor поддерживает только веб-сокет, с точки зрения клиента. Я хотел бы понять, может ли библиотека JS Meteor Client работать с сервером, который может предоставлять только сетевые сокеты. –

ответ

0

В конечном итоге мы решили реализовать подмножество протокола SockJS (http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html) на C, используя сервер Mongoose HTTP (http://www.github.com/cesanta/mongoose).

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

Согласование осуществляется путем ответа на запрос sockjs/info. Следующий ответ гарантирует, что SockJS использует протокол веб-сокетов:

{"websocket":true,"origins":["*x:*"],"cookie_needed":false,"entropy":4271558656}

скриншот ниже показывает веб-сокетов трафика реализован до сих пор с нашей SockJsServer & DDPServer:

SockJS & DDP messages

3

Я Реализован библиотека DDP с открытым исходным кодом на C++, которая обрабатывает детали протокола. Он должен использоваться с некоторыми существующими библиотеками websocket, такими как mongoose, websocketpp, libwebsockets и т. Д.

Так, например, вызова ++ методы C с сайта MeteorJs выглядит следующим образом:

enter image description here

Получение данных в реальном времени из C++ также поддерживаются.

Более подробная информация и примеры - на GitHub: