gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:36 25 4
gpt4 key购买 nike

我尝试编写从一台服务器向多个客户端发送消息的程序。我必须在客户端使用 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 可以解决此问题。

关于c# - ZeroMQ C# 客户端不接收来自 C++ 服务器的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com