gpt4 book ai didi

python - EAGAIN 在 zeromq REQ/REP 上收到,没有阻塞套接字

转载 作者:行者123 更新时间:2023-11-30 05:14:34 26 4
gpt4 key购买 nike

我正在恢复一个基于 zeromq 的三年前项目。

代码在编写代码时(在 ubuntu 14.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);
}

初始化后,服务器开始无限循环调用这些代码行:

int rc=actual_socket->recv(&message);
if(rc!=0){
std::cout << "E: socket error number " << errno << " (" << zmq_strerror(errno) << ")" << std::endl;
}else{
std::cout << "I: received message" << std::endl ;
}

当我第一次编译它时,我开始只收到 EAGAIN 错误并且没有任何工作。所以,我写了两个简单的客户端,第一个用 C++,第二个用 Python。

第一个 (C++) 生成在客户端这个错误:

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 绑定(bind)之上的,所以测试 errno 或捕获异常是一样的。其实不然。

最佳答案

在您的 C++ 代码中,您使用的是 cppzmq 绑定(bind)吗?如果是这样,您应该在连接上使用 try/catch 来查看它是否失败,errno 仅在连接失败时有效。

https://github.com/zeromq/cppzmq/blob/master/zmq.hpp#L603

关于python - EAGAIN 在 zeromq REQ/REP 上收到,没有阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43388480/

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