gpt4 book ai didi

c++ - 如何使用 ZMQ 发送字符串结构

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:02 24 4
gpt4 key购买 nike

我想通过比较接收节点 B 的时间戳来比较集群的两个节点 A 和 B 之间的延迟。为此,我使用了一个预先存在的整数结构,但添加了一个字符串保存节点A的时间戳。

结构看起来像这样:

struct Content {
int id;
double a;
std::vector<char> timestamp;
};

为了在节点 A 准备数据,我使用了以下内容:

int fEventSize = 100;

Content* payload = new Content[fEventSize];

boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();

std::string str = to_simple_string(mst1);
std::vector<char> writable(str.begin(), str.end());
writable.push_back('\0');

(&payload[0])->timestamp = writable;

我随后创建了一个 ZMQ 消息,我 memcpy 有效载荷到消息中,然后像往常一样将它发送到节点 B。为了验证时间戳在节点 A 是否正确写入,以下工作正常:

cout << &(&payload[0])->timestamp[0]; << endl;

但是在节点 B 的接收端,虽然我可以正确打印 id 的值和结构的成员,但是当我尝试打印时间戳的值时出现段错误:

Content* input = reinterpret_cast<Content*>(msg->GetData());

cout << "x: " << (&input[0])->x << endl;

cout << "timestamp: " << &(&input[0])->timestamp[0] << endl;

这是为什么呢?这是使用 ZMQ 发送结构字符串成员的正确方法吗?

最佳答案

为了回答我的问题,以下对我有用:

结构看起来像这样:

struct Content {
int id;
double a;
char timestamp[30];
};

在节点 A 上:

//Create a high resolution timestamp in microseconds
boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();

//Convert the timestamp into an std::string
std::string str (to_simple_string (mst1));

//Copy the string to the struct member
std::size_t length = str.copy ((&payload[0])->timestamp, strlen(str.c_str()), 0);
(&payload[0])->timestamp[length]='\0';

//Copy the contents of the Content struct to the ZMQ message
memcpy(msg->GetData(), payload, fEventSize * sizeof(Content));

在节点 B 上:

//Cast the data to an input pointer of type Content
Content* input = reinterpret_cast<Content*>(msg->GetData());

std::cout << (&input[0])->timestamp << std::endl;

但是,其实还有一个更好的解决方案,那就是直接通过网络发送时间戳:

结构看起来像这样:

struct Content {
int id;
double a;
boost::posix_time::ptime timestamp;
};

在节点 A 上:

(&payload[0])->timestamp = boost::posix_time::microsec_clock::local_time();

//Copy the contents of the Content struct to the ZMQ message
memcpy(msg->GetData(), payload, fEventSize * sizeof(Content));

在节点 B 上:

//Cast the data to an input pointer of type Content
Content* input = reinterpret_cast<Content*>(msg->GetData());

//Convert the timestamp into a string
std::string mystr (to_simple_string ((&input[0])->mytimestamp));
cout << mystr.c_str() << endl;

通过这种方式,可以在客户端完成许多奇特的事情,而无需不断地在时间戳和字符串之间进行转换,例如,计算节点 A 和 B 之间的发送延迟(假设节点具有同步时钟)。

关于c++ - 如何使用 ZMQ 发送字符串结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com