【发布时间】:2016-12-01 03:13:26
【问题描述】:
尽管我的背景是 C#,但我正在尝试为工作项目学习 ZeroMq,并且在最简单的测试中,我似乎遇到了一个问题,即 socket.recv(...) 调用将阻止第一个收到的消息,但之后这会引发异常,因为接收到的数据量为 -1。
目前我的“服务器”是:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://127.0.0.1:5555");
while (true)
{
zmq::message_t message;
if (socket.recv(&message))
{
auto str = std::string(static_cast<char*>(message.data()), message.size());
printf("Receieved: %s\n", str.c_str());
}
}
这基本上来自 ZeroMq 文档中的第一个示例服务器。
我正在使用以下代码从 C#“客户端”推送 1 位数据:
using (var context = new ZContext())
using (var requester = new ZSocket(context, ZSocketType.REQ))
{
requester.Connect(@"tcp://127.0.0.1:5555");
requester.Send(new ZFrame(@"hello"));
requester.Disconnect(@"tcp://127.0.0.1:5555");
}
现在我启动服务器,然后启动客户端。我正确收到了第一条消息,并且能够正确打印。
但是现在当我再次点击socket.recv(&message) 时,代码不会阻塞而是会抛出异常,因为底层的zmq_msg_recv(...) 返回值-1。
我不确定为什么会发生这种情况,我不明白为什么它会收到另一条消息,因为我知道这个端口上没有其他东西。我遇到的唯一事情是调用zmq_msg_close(...),但这应该作为message_t 析构函数的一部分调用,我已经确认了这一点。
在套接字设置或我如何将其用于recv(...) 调用以停止阻塞方面,我做错了什么吗?
【问题讨论】:
-
'@'字符有什么作用?我的代码中没有。 -
啊,我明白了,它使字符串成为文字。所以它不能使用转义字符
'\'