- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在恢复一个基于 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 仅在连接失败时有效。
关于python - EAGAIN 在 zeromq REQ/REP 上收到,没有阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43388480/
我有一个程序从一个文件中读入,对输入进行一些处理,然后将它输出到一个套接字。一个多月以来它一直运行良好,突然我开始收到错误 11(EAGAIN?)错误,导致程序终止。当我启动程序的 32 个实例时,在
我有一个打开供读取的文件描述符,它可能是非阻塞的。我需要做的只是读取所有数据直到到达 EOF 并将该数据写入可写文件描述符。由于执行此复制的过程“不知道”周围发生的任何事情,我不认为我可以在等待数据时
所以,这是一个我有时看到但无法找出原因的奇怪案例。 我们有一个从常规文件读取的 C 程序。还有其他进程写入同一个文件。该应用程序基于这样一个事实,即写入在 Linux 中是原子的,写入大小高达 409
假设我有两个线程,主线程和一个专用于连续监听标准 TCP 套接字的线程。现在,说在某个时候我想关闭所有东西。从主线程,我想关闭监听线程正在处理的连接,然后加入线程并结束程序。 但是,这很棘手,因为我不
标题中的 EAGAIN 是什么意思? 最佳答案 EAGAIN在执行 non-blocking I/O 时经常被引发.这意味着“目前没有可用数据,稍后再试”。 它might (或 might not )
我在 Linux 上的一个项目使用阻塞套接字。事情发生得非常连续,所以非阻塞只会让事情变得更复杂。无论如何,我发现 recv() 调用经常返回 -1,其中 errno 设置为 EAGAIN。 man
尝试使用 pthread_create 生成线程时出现 EAGAIN。但是,根据我的检查,线程似乎已正确终止。 什么决定了操作系统在尝试使用 pthread_create 创建线程时给予 EAGAIN
我开发了一个 Android 应用程序,它有多个设备通过蓝牙套接字连接将数据发送回服务器设备,但是我遇到了错误: E/bt-btif: send none, EAGAIN or EWOULDBLOCK
我已经将 pthread 用于多线程程序,并且遇到了以下情况。当我在没有 sleep 命令的情况下运行代码时,它会在运行时导致错误,而当我添加 sleep 命令时,程序会按预期运行。 有 sleep
我正在 ubuntu linux 机器上用 c 编写客户端服务器套接字程序。服务器端需要处理很多连接,服务器和客户端都有一个本地套接字,在对它进行一些操作后将接收到的数据发送到本地进程,并且发送和接收
如果我在 Linux 中的非阻塞 tcp 套接字上使用 send(),除了发送缓冲区已满情况之外,它会返回 EAGAIN 吗? 我基本上需要决定是要将套接字发送缓冲区用作我的应用程序的唯一缓冲区,还是
我正在使用阻塞套接字来接受连接。我很少收到此错误,这使得调试变得困难。接受返回 EAGAIN 错误。这怎么可能是阻塞套接字? 最佳答案 如果套接字设置了接收超时(使用 SO_RCVTIMEO 套接字选
我实现了一个套接字客户端,通过 HTTP 与带有 RTSP 的网络摄像头通信,以从摄像头获取视频。 要与相机建立通信,首先我必须设置一个 HTTP-GET 隧道,然后发送 RTSP 命令。当相机失去连
我有一个通过 USB 接口(interface)的定制板。我正在编写 USB Linux 驱动程序。 当我在我的虚拟机上测试它时一切正常..但是当我切换到真实硬件并在硬件上使用 Yocto 并运行以下
我正在尝试学习如何使用 sigtimedwait(),但我发现它并没有等待超时完成。下面它似乎比它应该更快地返回 EAGAIN 4 秒(每 1 分钟超时快 1 秒): #include #inclu
我在通过以下方式打开的串行端口读取一些数据时遇到了一些问题。我已经多次使用这个代码实例并且一切正常,但是现在,由于某种我无法弄清楚的原因,我完全无法从串行端口读取任何内容。 我可以写,并且在另一端正确
我正在使用 QOpenGL 小部件绘制框架。但是,我正在努力使用 avcodec_receive_frame 获取帧。它在 else if (ret == AVERROR(EAGAIN)) block
我在 malloc() 上阅读了手册在 Solaris 中,发现 malloc()可以设置EAGAIN Solaris 中的错误。 手册写道: EAGAIN There is not enough m
我正在尝试用 C++ 创建一个 REQ Router Dealer REP 通信。子进程绑定(bind)路由器和经销商,路由器和经销商之间的代理,将 REP 连接到经销商并等待 zmq_recv
代码是这样的。在某些情况下,会返回eagain。 struct sigevent sev; sev.sigev_notify = SIGEV_THREAD_ID; sev._sigev_un._tid
我是一名优秀的程序员,十分优秀!