ZMQ через C# — привязка clrzmq к Windows XP не работает, но в Win7 все в порядке

Я разрабатывал платформу, используя ZMQ (2.2) в качестве основного уровня связи. Ранее на этой неделе я решил воспользоваться советом на веб-сайте zeromq и обновиться до последней стабильной сборки 3.2.2.

Однако после мучительного обновления до нового API я был серьезно разочарован, обнаружив, что существует проблема с привязкой clrzmq, заключающаяся в том, что она не может загрузить библиотеку libzmq на машинах с Windows XP (SP3). Я продолжаю получать исключение SEHException?!

Мне просто интересно, была ли у кого-нибудь такая же проблема, и есть ли обходной путь (или, что еще лучше, исправление) для нее?

Ваше здоровье :)

EDIT Просто чтобы уточнить, библиотека загружается нормально, я знаю это, потому что контекст создается без каких-либо проблем. Проблема возникает, когда метод CreateSocket вызывается в контексте... см. фрагмент кода ниже

        ZmqContext context = ZmqContext.Create();

        ZmqSocket socket = context.CreateSocket(SocketType.REQ);

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

Assertion failed: Connection refused (..\..\..\src\signaler.cpp:310)

Есть идеи, что это значит?

РЕДАКТИРОВАНИЕ Я также должен упомянуть, что эта проблема не возникает на всех компьютерах с XP, только на некоторых из них. Я пытался выяснить, в чем разница между работающими машинами и теми, которые не работают. Не зная этого, было бы слишком рискованно обновлять и выпускать в производственную среду.


person user1460473    schedule 06.02.2013    source источник
comment
Вы пытались включить трассировку для clrzmq, чтобы узнать, сообщает ли она какие-либо подробности о неудачной загрузке? Ознакомьтесь с вариантами трассировки здесь: github.com/zeromq/clrzmq#tracing.   -  person Jakob Möllås    schedule 06.02.2013
comment
@Jakob - я пытался это сделать, но по какой-то причине я не получаю никаких выводов трассировки из библиотеки? Я загрузил небольшой образец на свой SkyDrive (sdrv.ms/12vkVxG)   -  person user1460473    schedule 07.02.2013
comment
@Jakob - Я думаю, что слишком долго смотрел на экран!!! Я получаю некоторую трассировку из библиотеки (см. основную часть).   -  person user1460473    schedule 07.02.2013
comment
Код компилируется нормально и работает на моей машине без каких-либо исключений (хотя брандмауэр немного пожаловался, что нормально). Добавлен более длинный ответ с еще некоторыми идеями.   -  person Jakob Möllås    schedule 08.02.2013
comment
@Jakob - Прежде всего, спасибо, что нашли время, чтобы просмотреть это. Вы совершенно правы в своем ответе, когда говорите, что нет смысла привязывать REQ к подстановочному знаку. Когда я запустил образец проекта, я просто произвольно выбрал тип сокета.   -  person user1460473    schedule 08.02.2013
comment
продолжение - Моя проблема не в методе Bind (хотя, если бы метод CreateSocket сработал, следующая строка, вероятно, завершилась бы ошибкой из-за неправильного выражения привязки). На самом деле, похоже, не имеет значения, какой тип сокета я выберу, метод CreateSocket всегда терпит неудачу!? Я попытался запустить этот пример на нескольких компьютерах XP. Он работает на некоторых из них, а не на других!!   -  person user1460473    schedule 08.02.2013
comment
Хм, сложно, у меня больше нет идей на данный момент, вернусь, если что-нибудь придумаю. Если вы найдете решение или обнаружите проблему, пожалуйста, добавьте некоторую информацию, было бы интересно узнать, так как я планирую в будущем развернуть некоторый код ZeroMq на нескольких компьютерах с XP.   -  person Jakob Möllås    schedule 08.02.2013
comment
Просто идея, убедитесь, что вы используете clrzmq против последней (стабильной) zmqlib, то есть 3.2.2. Пакет nuget по умолчанию может быть настроен на использование более старой версии (3.0.0 или около того). Могут быть некоторые ошибки, которые были исправлены.   -  person Jakob Möllås    schedule 08.02.2013
comment
@JakobMöllås, есть идеи, где взять привязки .Net для версии 3.2.2, как для clrzmq, так и для libzmq? Я не могу найти их нигде, уж точно не на Nuget. Большое спасибо!!!   -  person Matt    schedule 19.06.2013
comment
@MattWolf Да, исходный код и проект находятся на Github, здесь, а пакет Nuget можно найти здесь. Обратите внимание, что информация о версии пакета Nuget устарела, но вы можете изменить конфигурацию пакета nuget, чтобы получить версию, соответствующую 3.2.2.   -  person Jakob Möllås    schedule 19.06.2013
comment
@JakobMöllås, библиотека nuget, на которую вы ссылались, показывает, что это версия 3.0.0rc1, которую я пробовал, и, похоже, она страдает от множества сбоев.   -  person Matt    schedule 19.06.2013
comment
@JakobMöllås, Привет, Джейкоб, просто дополнительный вопрос, потому что вы, кажется, являетесь экспертом по ZeroMQ: у меня есть МАРШРУТИЗАТОР, который связывается, и ДИЛЕРЫ, которые подключаются к этому МАРШРУТИЗАТОРУ. Как я могу гарантировать, что сообщения, отправленные на МАРШРУТИЗАТОР, будут отбрасываться и не ставиться в очередь, если ДИЛЕР больше не существует, но все же сообщения направляются через МАРШРУТИЗАТОР с DEALER.IDENTITY?   -  person Matt    schedule 19.06.2013


Ответы (1)


Глядя на приведенный вами пример, вы привязываетесь к сокету REQ (запрос, т.е. клиентский сокет), а также привязываете сокет REQ с помощью подстановочных знаков. Я не уверен, как это будет происходить, но для меня это не имеет смысла. Я не думаю, что это поддерживается, но я не могу найти или вспомнить какую-либо документацию о привязке к сокету REQ. Вероятно, произойдут странные вещи.

Сокет REP (ответ) — это «серверный» конец установки REQ/REP (запрос/ответ), где вы bind на стороне сервера используете сокет REP для конечной точки, либо явно указав «tcp ://127.0.0.1:5555" или с использованием подстановочных знаков, например "все интерфейсы", "tcp://*:5555". Затем клиентская сторона будет connect использовать сокет REQ для явного адреса конечной точки «tcp://127.0.0.1:5555», без подстановочных знаков.

Сервер сделает это:

ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REP);
socket.Bind("tcp://*:5501");

А клиент это:

ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REQ);
socket.Connect("tcp://127.0.0.1:5501");

Помимо этих проблем, вы также должны убедиться, что брандмауэр не блокирует, и убедитесь, что порт еще не используется (например, с помощью команды NETSTAT).

Правила адресации ZeroMq см. в документации API zmq_tcp, а для сокета см. документацию API zmq_socket.

person Jakob Möllås    schedule 07.02.2013