- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,该程序应该通过 ZeroMQ 发送 C 结构。因此,我使用 Google 的 ProtocolBuffers 来序列化结构。
我现在遇到的问题是我的订户端没有收到任何内容。发布者打印出“消息已成功发送”,因此我认为错误发生在订阅者端。
发布者:
int main (void)
{
Message protomsg = MESSAGE__INIT;
void *buf;
unsigned len;
void *context = zmq_ctx_new();
void *subscriber = zmq_socket(context, ZMQ_PUB);
zmq_bind(subscriber, "ipc://my.sock");
//Initialising protomsg (not so important)
//sending message
len = message__get_packed_size(&protomsg);
buf = malloc(len);
message__pack(&protomsg, buf);
zmq_msg_t output;
zmq_msg_init_size(&output, len);
zmq_msg_init_data(&output, buf, len, NULL, NULL);
if(zmq_msg_send(&output, subscriber, 0) == -1)
perror("Error sending message \n");
else
printf("Message successfully sent \n");
zmq_msg_close(&output);
free(buf);
zmq_close (subscriber);
zmq_ctx_destroy (context);
return 0;
}
订阅者:
int main (void){
Message *protomsg;
void *context = zmq_ctx_new ();
void *publisher = zmq_socket (context, ZMQ_SUB);
zmq_connect(publisher, "ipc://my.sock");
zmq_setsockopt(publisher, ZMQ_SUBSCRIBE, "", 0);
// Read packed message from ZMQ.
zmq_msg_t msg;
zmq_msg_init(&msg);
if(zmq_msg_recv(&msg, publisher, 0) == -1)
perror("Error receiving message \n");
else
printf("Message received");
memcpy((void *)protomsg, zmq_msg_data(&msg), zmq_msg_size(&msg));
// Unpack the message using protobuf-c.
protomsg = message__unpack(NULL, zmq_msg_size(&msg), (void *)&data);
if (protomsg == NULL)
{
fprintf(stderr, "error unpacking incoming message\n");
exit(1);
}
printf("Address: %u, Type: %u, Information[0]: %u, Information[1]: %u \n", protomsg->address-48, protomsg->frametype, protomsg->information[0], protomsg->information[1]);
zmq_msg_close (&msg);
// Free the unpacked message
message__free_unpacked(protomsg, NULL);
//close context,socket..
}
最佳答案
不知道是否有人仍然关心这个,但是这里...我同意@Steve-o的观点,这是一个时间问题,尽管我认为问题是你太早关闭了发布者套接字。
您的发布者代码发布消息,然后立即关闭套接字并终止上下文。因此,消息在发布者中存在几毫秒,然后就永远消失了。
如果您先运行发布者,它会执行该操作,然后退出并且消息消失。当您启动订阅者时,它会尝试连接到不再存在的 IPC 套接字。 ZeroMQ 允许这样做,并且订阅者将阻塞,直到有 IPC 套接字可以连接。
我还没有查看 ZeroMQ IPC 源代码,但我怀疑,在幕后,订阅者会定期尝试连接到发布者套接字。现在,如果您再次运行发布者,它可能会起作用,但您会遇到严重的竞争条件。如果您在 ZeroMQ 工作线程尝试重试的同时启动发布器,则连接可能会发生,您甚至可能在发布器销毁所有内容之前收到消息。
我很确定这个问题与结构和 protobuf 无关。从 ZeroMQ 的角度来看,您只是发送字节。没有区别。如果 ZeroMQ 字符串的测试用例与 ZeroMQ 结构的测试用例确实相同 - 那么代码更改可能会添加或删除几纳秒,从而能够以错误的方式打破竞争条件。
具体建议:
关于c - 使用 ZeroMQ 和 ProtocolBuffers 发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625119/
我正在尝试在 visual studio 2015 中调试 app_engine 项目。到目前为止,我有这些行: 我安装了 pip:端点、protopc、appengine 和 google-api-
我有一个 OrderList 类型的 protobuf 消息 message OrderList { repeated Order orders = 1; } 我想将这个订单列表传递到我编写的自定
我正在尝试使用 Google 的 ProtocolBuffer 在服务器/客户端架构中发送/接收数据。我能够将两者与 winsock 连接起来,并且能够使用它从 ProtocolBuffer 发送和接
我想知道如何检索从字节加载的 protobuf 的类型。 例如: Worklist work = Worklist.newBuilder().build(); byte[] msg = work.to
是否可以以 ProtocolBuffer 格式在 BigQuery 中导入数据?我已经有一个(非常)大的数据集采用这种格式,现在我想将它们推送到 BigQuery。但如果我能避免翻译成 json 左右
嗨,我是一名中国 iOS 工程师。 我正在尝试在 iPhone 上运行 Protocol Buffer ,我下载了 metasyntactic project来自谷歌代码,并按照您的介绍进行操作。 但
我最近升级了我的代码库(Java、C++ 和 C#)以使用 proto3。就 C# 而言,这涉及对代码的 2000 多次更改。这主要是语义上的,而且一切都很好,但有一个问题我似乎无法理解;序列化/反序
我从我通常使用的原型(prototype)类创建了一个 ProtocolBuffer 对象,我需要将它序列化。现在,我获取该对象并对其调用 SerializeToArray(),如下所示: int s
从事宠物项目(cassandra、spark、hadoop、kafka)我需要一个数据序列化框架。查看常见的三个框架 - 即 Thrift、Avro 和 Protocolbuffers - 我注意到它
我们最近才在 out 平台中采用 ProtocolBuffers,并且我在 v3 中看到了 FieldMasks 的引入,但我们似乎无法弄清楚如何使用它们。 我们已经使用 v3 编译器生成了我们的 p
我正在编写一个程序,该程序应该通过 ZeroMQ 发送 C 结构。因此,我使用 Google 的 ProtocolBuffers 来序列化结构。 我现在遇到的问题是我的订户端没有收到任何内容。发布者打
我有这段代码,它在升级 GAE Python NDB 之前可以工作: class MyHandler(webapp2.RequestHandler): def get(self,urlString
我使用 protobuf-net 序列化了数据,并且能够在 C# 中进行相同的处理。 放置一个 C# 虚拟 w# var file = File.Create("animal.bin"); //Cre
我开始将自定义序列化机制迁移到 Protocol Buffer 。一种特别经常使用的数据类型是 BigDecimal。 有谁知道在 Protocol Buffer 中序列化它的好方法吗?我们当前的序列
我是一名优秀的程序员,十分优秀!