与经典TCP套接字通信

时间:2015-02-26 21:11:25

标签: c# sockets tcp zeromq netmq

我正在用NetMQ编写我的第一个应用程序(.NET的ZeroMQ实现)。

我还需要使用传统的TCP套接字(也就是非0MQ套接字)监听客户端发送的信息。

我在官方的ZeroMQ文档here中看到了对这种套接字类型的可用性的引用,(寻找ZMQ_STREAM),但关于如何使用它的细节很少(这没有多大帮助)或者,.NET API与C ++ API有很大不同。)

offical NetMQ documentation也没有提及Streaming套接字类型。

最后,我在Github上查看了NetMQ的测试套件,并在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测试工具时,可以很好地打印byte []消息,例如像这样:

Hello World!

但是byte [] id打印出来像这样:

 ???♥

换句话说,我不知道id部分是什么。为什么routerSocket.Receive被调用两次? id中包含什么?这是ZeroMQ / NetMQ特有的,还是在这里提取的TCP / IP特定信息?

1 个答案:

答案 0 :(得分:2)

感谢@Mangist指出这一点。

答案在RouterSocket文档中:

  

身份(有时称为地址)只是一个二进制字符串   没有任何意义,除了"这是连接的唯一句柄"。   然后,当您通过ROUTER套接字发送消息时,首先发送一个   身份框架。

     

当接收消息时,ZMQ_ROUTER套接字应该预先添加消息   包含消息的始发对等体的标识的部分   在将它传递给应用程序之前。收到的消息是   从所有相互关联的同行中排队等候。发送消息时   ZMQ_ROUTER套接字应删除消息的第一部分并使用   它确定消息应被路由的对等体的身份   到。

     

身份是一个难以理解的概念,但它是必不可少的   如果你想成为ZeroMQ专家。 ROUTER套接字发明了一个   与其相关的每个连接的随机标识。如果有   三个REQ插座连接到ROUTER插座,它将发明三个   随机标识,每个REQ套接字一个。

此图片说明了ID帧的核心概念:

enter image description here