Как спроектировать асинхронную обработку сокетов nanomsg и tty или Netlink? - PullRequest
0 голосов
/ 30 июня 2018

Как я могу написать основной цикл (в C для системы Linux), который блокирует при ожидании сообщений из нескольких источников, таких как
a) гнездо nanomsg и последовательный порт, или
b) гнездо nanomsg и гнездо Netlink?

С чего начать?

Я думаю, что я мог бы опросить сокет nanomsg, затем опрашивать последовательный порт, а затем спать, например, 0,1 с, но это паттерн, которого я бы хотел избежать, если это возможно.

1 Ответ

0 голосов
/ 30 июня 2018

Если вышеприведенный подход является способом, который вы не хотите использовать, то можно сделать следующее:

1)
Создайте поток с автономным последовательным портом -сканером, оборудуйте этот поток PAIR/PAIR или PUSH/PULL (как видно из потока сканера портов side) соединение с основным, лучше всего использовать транспортный класс с нулевыми или низкими издержками ~ inproc:// или ipc:// (транспортный класс tcp:// просто тратит слишком много служебных данных для доставки межпотоковой сигнализации / обмена сообщениями). Сделайте так, чтобы этот поток сканера отправлял все, что вам нужно, по этой восходящей линии связи на главную, когда вы чувствуете, что это уместно.

2)
Создайте нить с помощью автономного -сканера, оборудуйте эту нить PAIR/PAIR или PUSH/PULL (как видно из соединение со стороной резьбы гнезда) с основным, лучше всего использовать транспортный класс с нулевой или низкой служебной нагрузкой ~ inproc:// или ipc://. Сделайте так, чтобы этот поток сканера отправлял все, что вам нужно, по этой восходящей линии связи на главную, когда вы чувствуете, что это уместно.

3)
Оснастите main() обоими соответствующими контрагентами (2x PAIR -s или 2x PULL -s), как определено в 1) и 2), и поддержите эту инфраструктуру плоскости сигнализации / обмена сообщениями между потоками в рабочем состоянии.

4)
Наслаждайтесь "комфорт" тривиального вызова блокировки на .poll() в main(){...} (как вы хотели выше, тогда как я профессионально выступаю за использование неблокирующего кода, всегда ... но также признавать, но не уважать ваше выраженное выше желание потерять свой собственный элемент управления кодом, во время неопределенно долгого ожидания события разблокирования - если оно когда-либо произойдет)

5)
Если .poll() получил какое-либо сообщение, выполните aRetCODE = nn_recv( aS, &B, aBsz, NN_DONTWAIT ); чтение соответствующей сигнальной восходящей линии связи с любого из потоков сканера.

6)
Loop.

...