- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑以下两个过程:
发件人.cpp:
#include <zhelpers.h>
...
zmq::context_t ctx(1);
...
void foo(int i)
{
zmq::socket_t sender(ctx, ZMQ_REQ);
sender.connect("tcp://hostname:5000");
std::stringstream ss;
ss <<"bar_" <<i;
std::string bar_i(std::move(ss.str());
s_sendmore(sender, "foo ");
(i != N) ? s_send(sender, bar, 0) : s_send(sender, "done", 0);
s_recv(sender);
}
int main()
{
for(int i=0; i<=100000; ++i)
foo(i);
return 0;
}
接收器.cpp
#include <zhelpers.h>
...
int main()
{
zmq::context_t ctx(1);
zmq::socket_t rcv(ctx, ZMQ_REP);
rcv.bind("tcp://*:5000");
std::string s1("");
std::string s2("");
while(s2 != "done")
{
s1 = std::move(s_recv(rcv));
s2 = std::move(s_recv(rcv));
std::cout <<"received: " <<s1 <<" " <<s2 <<"\n";
s_send(rcv, "ACK");
}
return 0;
}
让我们开始这两个过程。我期望的是接收进程将接收发送方发送给它的所有消息并打印出来:
foo bar_1
foo bar_2
...
依此类推,直到:
...
foo bar_100000
而且我希望它会在没有任何阻塞的情况下执行此操作。
我的问题是接收器总是停留在第 28215 次迭代附近(总是在那个数字附近!!!)并阻塞到一分钟左右。然后它会更进一步直到 100000,但有时它会再次粘住。我的问题当然是:为什么会这样?我该如何解决?
我尝试将“发送者”放在全局范围内的 foo(.) 中,然后它起作用了:在那种情况下,所有打印输出都从 1 平滑且超快地进行,没有任何阻塞(当然在这种情况下,每次调用 foo(.) 时都不会创建套接字)。但不幸的是,在我的代码中我不能这样做。
我想了解为什么会出现此 block 。
最佳答案
首先,您的示例不太可靠,因为它们无法编译。所以这里有一些应该接近您的意图并实际编译的示例
发件人.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <string>
void send(const std::string& msg)
{
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REQ);
std::cout << "Connecting to receiver ..." << std::endl;
socket.connect ("tcp://localhost:5555");
zmq::message_t request (100);
memcpy (request.data (), msg.c_str(), 100);
std::cout << "Sending message " << msg << "..." << std::endl;
socket.send (request);
}
int main ()
{
for(int i = 0; i < 100000; ++i)
{
send(std::to_string(i));
}
send("done");
}
使用链接
g++ -std=c++11 -I/home/dev/cppzmq -I/home/dev/libzmq/include sender.cpp -lzmq -o sender
接收器.cpp
#include <zmq.hpp>
#include <string>
#include <cstring>
#include <iostream>
int main () {
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REP);
socket.bind ("tcp://*:5555");
char buf[100] = {0};
while (std::string(buf).compare("done")) {
zmq::message_t request;
// Wait for next request from client
socket.recv (&request);
std::memcpy(buf, request.data(), 100);
std::cout << "Received message " << buf << std::endl;
// Send reply back to client
zmq::message_t reply (5);
memcpy (reply.data (), "Hello", 5);
socket.send (reply);
}
return 0;
}
使用
g++ -std=c++11 -I/home/dev/cppzmq -I/home/dev/libzmq/include receiver.cpp -lzmq -o receiver
启动流程时,一切似乎都正常,接收器上的输出符合预期,没有中断:
Received message 99996
Received message 99997
Received message 99998
Received message 99999
Received message done
但如我所料:看看 netstat:
netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:38345 localhost:5555 TIME_WAIT
tcp 0 0 localhost:46228 localhost:5555 TIME_WAIT
tcp 0 0 localhost:60309 localhost:5555 TIME_WAIT
tcp 0 0 localhost:46916 localhost:5555 TIME_WAIT
tcp 0 0 localhost:47600 localhost:5555 TIME_WAIT
tcp 0 0 localhost:54454 localhost:5555 TIME_WAIT
tcp 0 0 localhost:46409 localhost:5555 TIME_WAIT
tcp 0 0 localhost:51142 localhost:5555 TIME_WAIT
tcp 0 0 localhost:40355 localhost:5555 TIME_WAIT
tcp 0 0 localhost:40005 localhost:5555 TIME_WAIT
tcp 0 0 localhost:45614 localhost:5555 TIME_WAIT
tcp 0 0 localhost:48974 localhost:5555 TIME_WAIT
tcp 0 0 localhost:41427 localhost:5555 TIME_WAIT
tcp 0 0 localhost:58740 localhost:5555 TIME_WAIT
tcp 0 0 localhost:58754 localhost:5555 TIME_WAIT
tcp 0 0 localhost:60044 localhost:5555 TIME_WAIT
tcp 0 0 localhost:57478 localhost:5555 TIME_WAIT
tcp 0 0 localhost:50419 localhost:5555 TIME_WAIT
tcp 0 0 localhost:44361 localhost:5555 TIME_WAIT
tcp 0 0 localhost:37284 localhost:5555 TIME_WAIT
tcp 0 0 localhost:38662 localhost:5555 TIME_WAIT
tcp 0 0 localhost:45968 localhost:5555 TIME_WAIT
tcp 0 0 localhost:57407 localhost:5555 TIME_WAIT
tcp 0 0 localhost:59200 localhost:5555 TIME_WAIT
tcp 0 0 localhost:41292 localhost:5555 TIME_WAIT
tcp 0 0 localhost:55243 localhost:5555 TIME_WAIT
tcp 0 0 localhost:51489 localhost:5555 TIME_WAIT
tcp 0 0 localhost:48865 localhost:5555 TIME_WAIT
tcp 0 0 localhost:35491 localhost:5555 TIME_WAIT
...
在一次运行后,我有超过 20k (!) 个这样的套接字处于 TIME_WAIT 状态。这是因为sender.cpp
中void send(...)
中socket
的变量作用域。我不知道 zmq 在超出范围时销毁套接字时到底做了什么,但我很确定它会在某个地方调用套接字的 fd 上的 close()
,这将使你的套接字进入这个 TIME_WAIT 状态。即使我的发送器和接收器运行顺利,我也不知道您的系统如何处理这么多套接字。另外,我不知道您的 zhelpers.h
文件是做什么的。但我知道,如果您将套接字置于全局范围内,则在一个套接字的发送端只会发生一次 close() 调用。我从这里开始调查更多。也许,看看 how-to-forcibly-close-a-socket-in-time-wait ...
关于c++ - ZeroMQ REQ/REP 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38379002/
你能举一些zeromq的例子吗? 最佳答案 假设您想要某种公告板。您希望通过订阅公告板来只允许某些人看到它。 这可以使用 ZeroMQ 的发布者/订阅者模型来完成。 现在,假设您需要发送一些异步消息。
因此,正如我在上一篇文章中所问的那样,我希望能够使用不同语言编写的程序或函数在它们之间进行通信。 我最近遇到了 zeromq,我试图弄清楚这是否可以帮助我,因为它提供了某种套接字。例如,zeromq
与通过 POLLIN 多路复用多个套接字有何不同? while True: socks = dict(poller.poll()) if socks.get(control_recei
我正在设计一个与 ZeroMQ 对话的服务器应用程序。无需深入细节,服务器将存储和服务(来自查询请求)(eventid, eventstring)元组。 我的问题涉及有线协议(protocol)的设计
我有一个服务器(在 Amazon 上运行)和一个连接到它的客户端。建立连接后,客户端和服务器专门相互通信并发送消息。 例如 1. Client -> Server 2. Client -> Serve
我正在开发一个新的客户端-服务器应用程序 (.Net),并且到目前为止一直在使用 WCF,它非常适合应用程序的请求-响应方法。然而,我被要求用基于套接字的解决方案替换它,部分是为了支持非 .Net 客
我正在尝试做一个发布/订阅架构,其中多个发布者和多个订阅者存在于同一总线上。根据我在互联网上阅读的内容,只有一个套接字应该调用 bind(),而所有其他套接字(无论是 pub 还是 sub)都应该调用
使用zeromq,发送者发送10条消息后,发送者崩溃。 场景1:接收方正在一条一条地处理消息,花费了一些明显的时间成本,在这种情况下它还会收到 10 条消息吗? 场景 2:另一种情况是,当接收器崩溃时
我有一个 ZeroMQ 套接字,它正在从不同机器上的多个进程接收数据。在不改变数据内容的情况下,有没有办法识别数据的来源呢?具体来说,我想要发送者的 IP 地址(如果它来自 TCP 连接)。 最佳答案
有人知道在哪里可以找到有关 ZeroMQ 延迟与 29 West LBM 等竞争对手的性能详细信息吗? 看起来便宜得多,但我找不到任何指标来决定哪个更合适。 最佳答案 ZeroMQ 和 29West
有没有办法在不使用转发器概念的情况下使用 zeroMQ 库进行消息广播? 最佳答案 是的,一个 PUB 套接字将广播到所有连接的 SUB 套接字。只有当您想要桥接不同的网络时才需要转发器(代理),例如
几天前我才开始使用zeromq。我的目标是设计一个具有多个代理(代理网络)的发布订阅系统。我已经阅读了 zeromq 指南的相关部分,并为简单的发布子系统编写了代码。如果有人可以帮助我解决以下问题:
我需要编写一个订单管理器,将客户(股票、外汇等)订单发送到适当的交易所。客户想要发送订单,但对 FIX 或其他专有协议(protocol)一无所知,只知道发送订单的内部(规范化)格式。我有应用程序(服
我正在尝试从示例 wuclient/wuserver 在 zeromq 上实现一个惰性订阅者。 客户端比服务器慢得多,因此它必须只获取服务器最后发送的消息。 到目前为止,我发现这样做的唯一方法是连接/
我是 ZeroMQ 的新手并试图找出设计问题。我的情况是我有一个或多个客户端向单个服务器发送请求。服务器将处理请求,做一些事情,并向客户端发送回复。有两个条件: 回复必须发送到发送请求的客户端。 如果
如 docs 中所述在 3.x 版本的 zeromq 中,PUB/SUB 场景中的消息正在被过滤 出版商侧(而不是在订阅者方面,这是微不足道的)。 对我来说,这听起来像是发布者必须持有所有连接的套接字
引自 ZeroMQ 指南 However, with a little extra work, this humble pattern becomes a good basis for real wo
假设我有一个带有 ZeroMQ 接口(interface)的节点(进程、线程等),比方说一个 REP 套接字。这意味着我有一个无限主循环,它在 zmq_recv 或 zmq_poll 函数中休眠。 现
我想以某种方式比较 grpc 与 Zeromq 及其模式的功能:并且我想创建一些比较(功能集) - 不知何故 - 0mq 是“更好”的套接字 - 但无论如何 - 如果我应用 0mq模式 - 我认为我得
我正在试验 ZeroMQ。我发现在 ZeroMQ 中非常有趣,connect 或 bind 先发生并不重要。我试着查看 ZeroMQ 的源代码,但它太大了,找不到任何东西。 代码如下。 # clien
我是一名优秀的程序员,十分优秀!