Комуникация с класически TCP сокет

Пиша първото си приложение с 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?


person romatthe    schedule 26.02.2015    source източник
comment
Вижте връзка към документацията на RouterSocket. Този тип сокет има ID пред всяко съобщение. Това е двоичен идентификатор, така че няма да можете да го отпечатате с помощта на ASCII.GetString(). Можете да създадете int от 4-те байта и да отпечатате стойността на това int, ако искате да видите ID на съобщението.   -  person Jon    schedule 27.02.2015
comment
@Ах, благодаря! По някаква причина гледах Steam Sockets. Благодаря ви, това обяснява много. Идентификаторът има ли някакво значение, когато използвате RouterSocket за свързване на не-0MQ клиент?   -  person romatthe    schedule 06.03.2015


Отговори (1)


Благодаря на @Mangist, че посочи това.

Отговорът е в документацията на RouterSocket:

Самоличността, понякога наричана адрес, е просто двоичен низ без значение освен „това е уникален манипулатор на връзката“. След това, когато изпращате съобщение през гнездо ROUTER, първо изпращате рамка за самоличност.

При получаване на съобщения ZMQ_ROUTER сокет трябва да добави към съобщението част от съобщението, съдържаща самоличността на първоначалния партньор, преди да го предаде на приложението. Получените съобщения се поставят в опашка от всички свързани партньори. При изпращане на съобщения ZMQ_ROUTER сокет трябва да премахне първата част от съобщението и да я използва, за да определи самоличността на партньора, към който съобщението трябва да бъде насочено.

Идентичностите са трудна концепция за разбиране, но е от съществено значение, ако искате да станете ZeroMQ експерт. Сокетът ROUTER измисля произволна идентичност за всяка връзка, с която работи. Ако има три REQ сокета, свързани към ROUTER сокет, той ще измисли три произволни идентичности, по една за всеки REQ сокет.

Това изображение илюстрира основната концепция на ID рамките:

въведете описание на изображението тук

person romatthe    schedule 05.03.2015