ZMQ чрез C# - свързването на clrzmq Windows XP е неуспешно, но е ОК на Win7

Разработвах платформа, използваща ZMQ (2.2) като основен комуникационен слой. По-рано тази седмица реших да се възползвам от съвета на уебсайта zeromq и да надстроя до най-новата стабилна версия 3.2.2

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

Просто се чудех дали някой там е имал същия проблем и дали има заобиколно решение (или дори по-добре решение) за него?

Наздраве :)

РЕДАКТИРАНЕ Само за пояснение, библиотеката се зарежда добре, знам това, защото контекстът е създаден без проблем. Проблемът възниква, когато методът CreateSocket се извика в контекста... вижте кодовия фрагмент по-долу

        ZmqContext context = ZmqContext.Create();

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

След добавяне на проследяване, както беше предложено от Jakob, получавам следния изход

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: Имам РУТЕР, който се свързва, и ДИЛЪРИ, които се свързват с този РУТЕР. Как мога да гарантирам, че съобщенията, изпратени до ROUTER, ще бъдат премахнати и няма да бъдат поставени на опашка, ако DEALER вече не съществува, но въпреки това съобщенията се маршрутизират през ROUTER с 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 вижте документацията на zmq_tcp API, а за сокета вж. документацията за API на zmq_socket.

person Jakob Möllås    schedule 07.02.2013