ZeroMQ C#客户端不接收来自C++服务器的消息

ZeroMQ C# client doesnt receive messages from C++ server

本文关键字:C++ 服务器 消息 客户端 ZeroMQ      更新时间:2023-10-16

我曾尝试对从一台服务器向多个客户端发送消息进行编程。我必须在客户端使用C#,在服务器端使用C++。我以http://zguide.zeromq.org/page:all#toc8对于服务器:

#define within(num) (int) ((float) num * rand () / (RAND_MAX + 1.0))
int main () {
//  Prepare our context and publisher
zmq::context_t context (1);
zmq::socket_t publisher (context, ZMQ_PUB);
publisher.bind("tcp://*:5556");
//publisher.bind("ipc://weather.ipc");
//  Initialize random number generator
srand ((unsigned) time (NULL));
while (1) {
    int zipcode, temperature, relhumidity;
    //  Get values that will fool the boss
    zipcode     = within (100000);
    temperature = within (215) - 80;
    relhumidity = within (50) + 10;
    //  Send message to all subscribers
    zmq::message_t message(20);
    _snprintf ((char *) message.data(), 20 ,
        "%05d %d %d", zipcode, temperature, relhumidity);
    publisher.send(message);
}
return 0;
}

对于客户:

namespace ZMQGuide
{
internal class Program
{
    public static void Main(string[] args) {
        Console.WriteLine("Collecting updates from weather server…");
        // default zipcode is 10001
        string zipcode = "10001 "; // the reason for having a space after 10001 is in case of the message would start with 100012 which we are not interested in
        if (args.Length > 0)
            zipcode = args[1] + " ";
        using (var context = new Context(1))
        {
            using (Socket subscriber = context.Socket(SocketType.SUB))
            {
                subscriber.Subscribe(zipcode, Encoding.Unicode);
                subscriber.Connect("tcp://localhost:5556");
                const int updatesToCollect = 100;
                int totalTemperature = 0;
                for (int updateNumber = 0; updateNumber < updatesToCollect; updateNumber++)
                {
                    string update = subscriber.Recv(Encoding.Unicode);
                    totalTemperature += Convert.ToInt32(update.Split()[1]);
                }
                Console.WriteLine("Average temperature for zipcode {0} was {1}F", zipcode, totalTemperature / updatesToCollect);
            }
        }
    }
}
}

他们彼此不交流。在客户端(C++),我评论了ipc交互行,因为在Windows客户端上ipc失败了。在这种情况下,C#-C#、C++-C++交互可以正常工作。我使用clrzmq 2.2.5。

如果有任何帮助,我将不胜感激。

C#客户端正在使用Encoding.Unicode,这是一种2字节的Unicode表示形式(UTF-16)。C++服务器正在使用ASCII。

ZMQ订阅匹配在字节级别工作,不在字符编码之间转换,所以这就是我的问题所在。在C#客户端中切换到Encoding.ASCII或Encoding.UTF8解决了这个问题。