Могу ли я смешать сервер ZeroMQ TCP / UDP с обычным клиентом BSD TCP / UDP-сокета? - PullRequest
0 голосов
/ 20 октября 2019

Могу ли я запустить сервер ZeroMQ TCP / UDP и обмениваться данными с ним с помощью обычного клиента сокета BSD TCP / UDP?

У меня есть несколько машин, взаимодействующих друг с другом, некоторые из которых зависят от библиотек с низким уровнемклиенты сокетов, которые в противном случае трудно перенести на ZMQ.

1 Ответ

1 голос
/ 20 октября 2019

Q : "Можно ли запустить сервер ZeroMQ TCP / UDP и установить связь с ним с помощью обычного клиента сокета BSD TCP / UDP?"

A: Да, но ...

Ну, нет ничего похожего на a " Сервер TCP / UDP "в ZeroMQ. ZeroMQ использует высокоуровневые архетипы поведения { PUSH/PULL | PUB/SUB | REQ/REP | ... | PAIR/PAIR }, для которых можно выбрать один или несколько (да, отправитель PUB может получать доставленные сообщения всем vmci:// и ipc:// и pgm:// и tcp:// SUB -агентов в одном и том же «сокете» -архитипа сразу) transport-classes, верно из-за того, что абстрагированные transport-class данные-насосы являются скрытым, но «специализированным» компонентом, который обрабатывает все скрытые низкоуровневые детали - каждая немного отличается, для обслуживания каждого конкретного транспортного класса по мере необходимости с отдельнымДанные * transport-class для конкретных насосов:
{ inproc:// | ipc:// | tipc:// | tcp:// | pgm:// | epgm:// | norm:// | vmci:// }.


Тем не менее, существует "специальный" Socket- архетип, который может «разговаривать» с контрагентами, отличными от ZeroMQ, и, таким образом, может служить нужным вам требованиям:

ZMQ_STREAM

Сокет типа ZMQ_STREAM используется для отправки и получения данных TCP от однорангового узла, отличного от ØMQ, при использовании транспорта tcp://. Сокет ZMQ_STREAM может выступать в роли клиента и / или сервера, отправляя и / или получая данные TCP асинхронно.

При получении данных TCP a ZMQ_STREAMперед передачей его приложению сокет должен добавить к сообщению часть сообщения, содержащую маршрутизацию id инициирующего однорангового узла. Полученные сообщения ставятся в очередь из всех подключенных узлов.

При отправке данных TCP сокет ZMQ_STREAM должен удалить первую часть сообщения и использовать ее для определения маршрутизации id однорангового узла, на которое должно быть перенаправлено сообщение, а сообщения с невозможностью перенаправления должны вызвать ошибку EHOSTUNREACH или EAGAIN.

Чтобы открыть соединение с сервером, используйте zmq_connect вызовите, а затем получите маршрутизацию сокета id, используя zmq_getsockopt() вызов с опцией ZMQ_ROUTING_ID.

Чтобы закрыть определенное соединение, отправьте кадр идентификатора маршрутизации с последующим сообщением нулевой длины.

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

Необходимо отправить один кадр идентификатора маршрутизации, за которым следует один кадр данных. Флаг ZMQ_SNDMORE необходим для маршрутизации фреймов id, но игнорируется для фреймов данных.

Просто помните об обработке справедливой очереди всех подключенных одноранговых узлов ZMQ_STREAMна входящем направлении.

...