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на входящем направлении.