Пиша първото си приложение с NetMQ (имплементация на ZeroMQ за .NET).
Също така трябва да слушам информация, изпратена от клиент, използващ традиционен TCP сокет (известен още като сокет, който не е 0MQ).
Виждал съм препратки към наличността на този тип сокет в официалната документация на ZeroMQ тук, (потърсете ZMQ_STREAM), но има много малко подробности за това как да го използвате (и това също не помага много, .NET API е доста по-различен от C++ API).
В официалната документация на NetMQ също не се споменава типът сокет за поточно предаване.
Най-накрая разгледах тестовия пакет за NetMQ в Github и намерих частичен отговор на въпроса си в метод RawSocket.
Следният фрагмент работи:
using (NetMQContext context = NetMQContext.Create())
{
using (var routerSocket = context.CreateRouterSocket())
{
routerSocket.Options.RouterRawSocket = true;
routerSocket.Bind("tcp://127.0.0.1:5599");
byte[] id = routerSocket.Receive();
byte[] message = routerSocket.Receive();
Console.WriteLine(Encoding.ASCII.GetString(id));
Console.WriteLine(Encoding.ASCII.GetString(message));
}
}
Когато използвате стандартни инструменти за тестване на TCP/IP, съобщението byte[] се отпечатва добре, напр. като този:
Hello World!
но идентификаторът на byte[] се отпечатва така:
???♥
С други думи, нямам представа какво става с частта за id. Защо routerSocket.Receive се извиква два пъти? Какво се съдържа в идентификатора? Това нещо специфично за ZeroMQ/NetMQ ли е или тук се извлича нещо специфично за TCP/IP?