为何C++代码通过ZMQ向GNU Radio Companion发送数据失败?
代码片段
发送端代码(zmq_send.cpp)
#include <zmq.h> #include <string.h> #include <stdio.h> #include <unistd.h> #include <iostream> using namespace std; int main (void) { void *context = zmq_ctx_new (); void *requester = zmq_socket (context, ZMQ_PUSH); zmq_connect (requester, "tcp://192.168.0.243:2000"); unsigned short buffer[1]; buffer[0] = 1; while(1) { cout << "Sending " << buffer[0] << endl; zmq_send (requester, buffer, 2*1, 0); buffer[0] = buffer[0] + 1; sleep(1); } zmq_close (requester); zmq_ctx_destroy (context); return 0; }
接收端测试代码(zmq_recv.cpp)
#include <zmq.h> #include <string.h> #include <stdio.h> #include <unistd.h> #include <assert.h> #include <iostream> using namespace std; int main (void) { void *context = zmq_ctx_new (); void *responder = zmq_socket (context, ZMQ_PULL); int rc = zmq_bind (responder, "tcp://192.168.0.243:2000"); assert (rc == 0); unsigned short buffer [1]; while (1) { zmq_recv (responder, buffer, 2*1, 0); cout << buffer[0]; cout << endl; sleep (1); } return 0; }
问题现象
上述两段C++代码之间可正常完成ZMQ数据传输,但将zmq_send.cpp作为发送端向GNU Radio Companion(GRC)流图发送数据时,GRC中的Time Sink无数据显示,文件保存模块也未记录任何数据。
原因分析及解决方案
套接字类型与连接逻辑不匹配:
GRC的ZMQ源模块需配置为ZMQ_PULL类型,且需确保连接逻辑正确:发送端用zmq_connect,则GRC的ZMQ源需用zmq_bind绑定到同一地址端口(如tcp://192.168.0.243:2000),且必须先启动GRC流图,再运行发送端代码——ZMQ的PUSH/PULL模式要求接收端先完成绑定,否则初始发送的数据会丢失。数据类型不兼容:
GNU Radio对输入数据类型有严格要求,需确保GRC中ZMQ源的Output Type设置为short(与发送端的unsigned short匹配)。若类型不匹配,GRC会解析出无效数据,表现为无输出。字节序(端序)问题:
ZMQ传输的是原始字节流,若发送端与GRC的字节序不一致,会导致数据解析错误。可在发送端将数据转换为网络字节序后再发送,修改发送代码中的数据赋值部分:buffer[0] = htons(1); // 初始值转网络字节序 // ... buffer[0] = htons(ntohs(buffer[0]) + 1); // 递增时先转回主机序,计算后再转网络序GRC配置错误:
检查ZMQ源模块的地址是否正确填写,确认无拼写错误;同时确保流图中ZMQ源后的处理模块(如Time Sink)已正确连接,且模块参数配置符合数据类型要求。网络或权限限制:
检查防火墙是否允许端口2000的TCP通信,确保GNU Radio进程有绑定端口的权限,以及发送端与GRC运行环境的网络连通性。
内容的提问来源于stack exchange,提问作者Mobi Zaman

