Я пишу свое первое приложение с NetMQ (реализация ZeroMQ для .NET).Общение с классическим сокетом TCP
Мне также нужно прослушать информацию, отправленную с клиента, используя традиционный сокет TCP (a.k.a не-0MQ сокет).
Я видел ссылки на доступность этого типа сокета в официальной документации ZeroMQ here (смотрите ZMQ_STREAM), но очень мало деталей о том, как его использовать (и это тоже мало помогает, .NET API совсем немного отличается от C++ API).
offical NetMQ documentation также не упоминает тип Streaming socket.
Наконец, я просмотрел комплект тестов для NetMQ на Github и нашел частичный ответ на мой вопрос в method 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, байт [] сообщение печатается красиво, например, как это:
Hello World!
но байт [] идентификатор печатается так:
???♥
Другими словами, я понятия не имею, что случилось с частью идентификатора. Почему routerSocket.Receive называется дважды? Что содержится в идентификаторе? Является ли это чем-то специфичным для ZeroMQ/NetMQ, или что-то конкретная информация TCP/IP здесь извлекается?
Обратитесь к документации [ссылка] (http://netmq.readthedocs.org/en/latest/router-dealer /) на RouterSocket. Этот тип сокета имеет идентификатор перед каждым сообщением. Это двоичный идентификатор, поэтому вы не сможете распечатать его с помощью ASCII.GetString(). Вы можете создать int из 4 байтов и напечатать значение этого int, если хотите увидеть идентификатор сообщения. – Mangist
@ А, спасибо! По какой-то причине я смотрел на Steam Sockets. Спасибо, это объясняет многое. Имеет ли идентификатор какой-либо смысл при использовании RouterSocket для подключения клиента, отличного от 0MQ? –