ZeroMQ: проверьте, слушает ли кто-то за сокетом домена Unix - PullRequest
5 голосов
/ 23 апреля 2011

Контекст: Linux (Ubuntu), C, ZeroMQ

У меня есть сервер, который прослушивает ipc:// сокет SUB ZeroMQ (который физически является сокетом домена Unix).

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

Проблема: если сервер убит (или иным образом неестественно умирает), файл сокета остается на месте. Если клиент пытается подключиться к этому устаревшему сокету, он блокируется в zmq_term().

Мне нужно предотвратить блокировку клиента, если сервера нет, но гарантировать доставку, если сервер жив, но занят.

Предположим, что я не могу отследить время жизни сервера по какой-то внешней магии (например, проверяя файл PID).

Есть какие-нибудь намеки?

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

Кажется, что непереносимое решение - это прочитать /proc/net/unix и найти там имя сокета.

1 голос
/ 29 апреля 2011

Без показа вашего кода все это - догадки ... это говорит ...

Если у вас есть пара PUB / SUB, PUB будет зависать, чтобы убедиться, что его сообщение проходит.Возможно, вы не используете правильный тип пары zmq.Похоже, вместо этого у вас есть пара REP / REQ.

Таким образом, когда вы подключаетесь с клиента (сторона REQ), вы можете сделать zmq_poll, чтобы определить, доступен ли сокет для записи.Если да, то продолжайте свою запись, в противном случае завершите работу клиента и обработайте условие ошибки (если это ошибка в вашей системе).

0 голосов
/ 01 июля 2011

Есть другое решение.Не используйте ipc: // сокеты.Вместо этого используйте что-то вроде tcp: //127.0.0.101: 10001.В большинстве UNIX это будет почти так же быстро, как IPC, потому что ОС распознает, что это локальное соединение, и ускоряет обработку полного стека IP.

0 голосов
/ 27 апреля 2011

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

...