我正在恢复一个在zeromq上构建的三年前的项目。在
据我所知,在编写代码的那一刻(在ubuntu14.04上),代码正在工作。现在(ubuntu 16.04和libzmq.so公司.5)代码已编译,但zeromq通信有问题,这让我抓狂。在
zeromq部分是我写的,所以我对代码非常了解,也许这就是为什么我看不到错误。在
服务器端代码相当复杂,但我尽量坚持相关部分:
WorkerServer::WorkerServer(){
address="tcp://*:4321";
justreceived=-1;
bind();
}
void WorkerServer::bind(){
actual_socket=server_socket();
actual_socket->bind(address.c_str());
std::cout << "I: server listening on " << address.c_str() << std::endl ;
}
static zmq::socket_t* server_socket(){
static zmq::context_t context(1);
return new zmq::socket_t(context, ZMQ_REP);
}
初始化后,服务器启动一个无休止的循环,该循环调用以下代码行:
^{pr2}$当我第一次编译它时,我开始接收到的只是EAGAIN错误,没有任何工作。 所以,我写了两个简单的客户端,第一个在C++中,第二个在Python中。在
第一个(C++)在客户端EME>生成此错误:
E: connect failed with error 11 (Resource temporarily unavailable)
第二个(Python)在服务器上生成以下错误:
E: socket error number 11 (Resource temporarily unavailable)
但客户实际上收到了一个回复。在
这是python代码:
#!/usr/bin/python
import zmq
import sys
port = "4321"
context = zmq.Context()
print "Connecting to server..."
socket = context.socket(zmq.REQ)
socket.connect ("tcp://localhost:%s" % port)
if len(sys.argv) > 2:
socket.connect ("tcp://localhost:%s" % port1)
# Do 10 requests, waiting each time for a response
for request in range (1,10):
print "Sending request ", request,"..."
socket.send ("Hello")
# Get the reply.
message = socket.recv()
print "Received reply ", request, "[", message, "]"
这是c++代码:
#include <string>
#include <vector>
#include <iostream>
#include "msgpack.hpp"
#include "unistd.h"
#include "cxxabi.h"
#include "zmq.hpp"
main(){
std::string server_name("tcp://localhost:4321");
static zmq::context_t context(1);
std::cout << "I: connecting to server " << server_name << " with context " << (void*)(context) << std::endl;
zmq::socket_t * client = new zmq::socket_t (context, ZMQ_REQ);
std::cout << "I: created client " << (void*)(client) << " with errno " << errno << std::endl;
sleep(1);
client->connect (server_name.c_str());
if(errno!=0){
std::cout << "E: connect failed with error " << errno << " (" << zmq_strerror (errno) << ")" << std::endl;
exit(1);
}
}
有什么想法吗?我不明白为什么这不起作用,为什么python和c++之间有如此大的区别。在
更新:
正如@James Harvey所指出的,这个代码可以工作。。。公司名称:
try{
std::cout << "Connecting..." << std::endl;
client->connect (server_name.c_str());
zmq::message_t request (5);
memcpy (request.data (), "Hello", 5);
std::cout << "Sending Hello " << std::endl;
client->send (request);
}catch(std::exception& e){
std::cout << "E: connect failed with error " << e.what() << std::endl;
}
我在想,由于zmqpp是基于C绑定构建的,所以测试errno或捕捉异常是一样的。 事实上,事实并非如此。在
在您的c++代码中,您是否使用cppzmq绑定?如果是这样,您应该在connect上使用try/catch来查看它是否失败,只有在connect失败时,errno才有效。在
https://github.com/zeromq/cppzmq/blob/master/zmq.hpp#L603
相关问题 更多 >
编程相关推荐