Scala+;ZMQ=在当前状态下无法完成操作 我试图通过请求回复模式,通过ScalOQ获得Scala程序与C++程序的通信。Scala程序应该向C++程序发送一个请求,该程序答复:

Scala+;ZMQ=在当前状态下无法完成操作 我试图通过请求回复模式,通过ScalOQ获得Scala程序与C++程序的通信。Scala程序应该向C++程序发送一个请求,该程序答复:,c++,scala,zeromq,C++,Scala,Zeromq,但是我看到了错误 org.zeromq.ZMQException:无法在当前状态下完成操作 但我能在docu中找到的是,在发送第二个请求之前,必须先阅读响应。在我的例子中,我发出一个请求,然后读取响应(这是引发异常的地方) 服务器的代码: #include "zmq.hpp" #include <string> #include <iostream> #include <thread> int main() { zmq::context_t cont

但是我看到了错误

org.zeromq.ZMQException:无法在当前状态下完成操作

但我能在docu中找到的是,在发送第二个请求之前,必须先阅读响应。在我的例子中,我发出一个请求,然后读取响应(这是引发异常的地方)

服务器的代码:

#include "zmq.hpp"
#include <string>
#include <iostream>
#include <thread>

int main()
{
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_REP);
    socket.bind("tcp://*:5555");


    while (1) {
        zmq::message_t request;
        socket.recv(&request);
        std::string requ = std::string(static_cast<char*>(request.data()), request.size());
        std::cout << requ << std::endl;

        //  Write response
        zmq::message_t req(2);
        memcpy((void *)req.data(), "ok", 5);
        socket.send(req);
    }
}
sbt的完整输出:

OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jna7980154308052950568.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
Connecting to backend
Sending Request
Receiving Response
[error] (run-main-0) org.zeromq.ZMQException: Operation cannot be accomplished in current state
org.zeromq.ZMQException: Operation cannot be accomplished in current state
        at org.zeromq.ZMQ$Socket.raiseZMQException(ZMQ.java:448)
        at org.zeromq.ZMQ$Socket.recv(ZMQ.java:368)
        at ZeroMQActor$.main(ZeroMQExample.scala:56)
        at ZeroMQActor.main(ZeroMQExample.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
[trace] Stack trace suppressed: run last compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) Nonzero exit code: 1
[error] Total time: 5 s, completed Jun 16, 2015 4:42:42 PM
OpenJDK 64位服务器VM警告:您已加载library/tmp/jna7980154308052950568.tmp,该库可能已禁用堆栈保护。VM现在将尝试修复堆栈保护。
强烈建议您使用“execstack-c”修复库,或使用“-z noexecstack”链接库。
连接到后端
发送请求
接收响应
[错误](run-main-0)org.zeromq.ZMQException:无法在当前状态下完成操作
org.zeromq.ZMQException:无法在当前状态下完成操作
位于org.zeromq.ZMQ$Socket.raiseZMQException(ZMQ.java:448)
位于org.zeromq.ZMQ$Socket.recv(ZMQ.java:368)
在ZeroMQActor$.main处(ZeroMQExample.scala:56)
位于ZeroMQActor.main(ZeroMQExample.scala)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
[trace]堆栈跟踪被抑制:运行上次编译:运行完整输出。
java.lang.RuntimeException:非零退出代码:1
在scala.sys.package$.error处(package.scala:27)
[trace]堆栈跟踪被抑制:运行上次编译:运行完整输出。
[错误](编译:运行)非零退出代码:1
[错误]总时间:5秒,已完成2015年6月16日下午4:42:42
Sbt支持Scala 2.9.1和akka zeromq 2.0。我已经从源代码处安装了zeromq 3.5,但我在安装ubuntu包libzqm3-dev时看到了相同的行为。一个可能的解决方法是使用一个纯基于java的zmq实现,但我更愿意依赖整个堆栈中的一个zmq库,而不是处理互操作问题

提前谢谢。

我相信

memcpy((void *)req.data(), "ok", 5);
应该是

memcpy((void *)req.data(), "ok", 2);

。。。这可能足以中断消息处理。

如果您还没有这样做,请尝试在纯scala中运行一个通用的REQ/REP示例(查找scala链接以获取scala代码)。如果运行,则将Scala服务器示例代码与C++服务器示例代码转换,然后重试。如果它运行,则在字符串/消息处理中的某个地方存在错误。如果没有,则可能是安装或语言绑定中存在错误。
memcpy((void *)req.data(), "ok", 2);