我正在尝试使用 ZMQ 4.2.3 和 cppzmq 中的子/ Release模式接收多部分消息我能够成功发送和接收单部分消息但是当我尝试在第二帧中读取它的大小始终为 0。让我完全困惑的是使用 NetMQ 的 C# 版本读取第二帧没有问题,让我相信它正在正确发送。我知道我遗漏了一些东西,但今天是我试图找出没有成功的原因的第二天。
这是我的酒吧代码
#include <iostream>
#include "zmq_addon.hpp"
void main()
{
zmq::context_t ctx = zmq::context_t();
zmq::socket_t pub = zmq::socket_t(ctx, zmq::socket_type::pub);
try
{
//binding using localhost gives an error about invalid device?
pub.bind("tcp://*:8845");
}
catch (...)
{
std::cout << zmq_strerror(zmq_errno());
std::cin.get();
return;
}
byte topic = 8;
std::string id = "ragefire.bob";
while (true)
{
std::cout << "Spam\n";
pub.send(id.c_str(), id.length(), ZMQ_SNDMORE);
pub.send("foo", 3);
}
}
还有我的C++子代码
#include <iostream>
#include "zmq_addon.hpp"
int main()
{
zmq::context_t ctx = zmq::context_t();
zmq::socket_t sub = zmq::socket_t(ctx, zmq::socket_type::sub);
sub.connect("tcp://localhost:8845");
std::string id = "ragefire.bob";
sub.setsockopt(ZMQ_SUBSCRIBE, id.c_str(), id.length());
while (true)
{
zmq::message_t msg;
if(sub.recv(&msg,ZMQ_NOBLOCK))
{
auto rpl = std::string(static_cast<char*>(msg.data()), msg.size());
std::cout << "Recv returned true! " << rpl << "\n";
int more;
auto more_size = sizeof(more);
sub.getsockopt(ZMQ_RCVMORE, &more, &more_size);
while (more)
{
zmq::message_t moreMsg;
sub.recv(&msg);
std::string moreRpl = std::string(static_cast<char*>(moreMsg.data()), moreMsg.size());
std::cout << "There's more! " << moreRpl << "Size is " << moreMsg.size() << "\n";
sub.getsockopt(ZMQ_RCVMORE, &more, &more_size);
}
}
else
std::cout << "Recv returned false! " << zmq_strerror(zmq_errno()) << "\n";
}
}
输出为
Recv returned true! ragefire.bob
There's more! Size is 0
为了完整起见,我的 NetMQ sub 可以读取两个帧
static void Main()
{
SubscriberSocket sub = new SubscriberSocket("tcp://localhost:8845");
sub.SubscribeToAnyTopic();
while (true)
{
NetMQMessage msg = sub.ReceiveMultipartMessage();
Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg.First.Buffer)}");
Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg[1].Buffer)}");
}
}
最佳答案
您对 sub.recv() 的初始调用在 &msg 中接收消息,这很好.
您随后对 sub.recv() 的调用也接收到 &msg,但您随后报告了有关 moreMsg 的信息。如果你真的想保留第二个 message_t,做
sub.recv(&moreMsg);
关于c++ - ZeroMQ 多部分消息第二部分 0 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45806886/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)