我试图通过带有 write() 的管道将一个结构发送到另一个进程,该结构包含一个向量,并且该向量在被另一个进程读取时给出零值。 每当进程发送一条消息时,它都会增加其向量的索引,当它接收到一条消息时,它也会增加其向量的索引,并将其他索引更新为接收到的值和先前存储的向量值的最大值(改进 Peterson Kearns 协议) 这是我要发送的结构
struct ptp_msg
{
char msg_buf[50];
int sending_process_nr;
};
struct ptp_err
{
pid_t pid;
int sending_process_nr;
int fildes[2];
};
struct msg_t
{
message_type msg_type;
vector<int> time_v;
vector<int> fail_v;
union contents
{
struct ptp_msg ptp_msg;
struct ptp_err ptp_err;
} contents;
};
这是发送结构的代码
int Pet_kea::send_msg(char *input, int fildes[2])
{
// inc T^i
time_v[id]++;
struct msg_t msg;
msg.msg_type = MSG;
sprintf(msg.contents.ptp_msg.msg_buf, input);
msg.time_v = time_v;
msg.contents.ptp_msg.sending_process_nr = id;
msg.fail_v = fail_v;
// send the message
cout << id << " vector sent =" << msg.time_v[0] << "-" << msg.time_v[1] << endl;
if (write(fildes[1], &msg, sizeof(msg)) < 0)
{
// handle error
}
store_msg(&msg, false);
return 0;
}
int Pet_kea::recv_msg(int fildes[2], struct msg_t *ret_buf)
{
// read message
int ret;
ret = read(fildes[0], ret_buf, sizeof(msg_t));
// do err checking
if (ret < 0)
{
}
cout << id << " vector recieved =" << ret_buf->time_v[0] << "-" << ret_buf->time_v[1] << endl;
// check if it is an errmsg
// inc T^i and inc T^/j to max(T^j of send event, prev event T^j)
time_v[id]++;
for (int i = 0; i < (int)time_v.size(); i++)
{
if (i == id)
continue;
time_v.at(i) = max(ret_buf->time_v[i], time_v[i]);
}
store_msg(ret_buf, true);
return 0;
}
谢谢您的帮助
我试图看看问题是否出在我的逻辑上,但测试的输出(也在上面的代码中)是 发送0向量=1-0 收到 1 个向量 =0-0 这些语句位于写入之前和读取之后,因此它们应该匹配
thnx 寻求帮助,这是我想出的基本代码:
void Pet_kea::serialize(struct msg_t *msg, char *data)
{
int *q = (int *)data;
*q = msg->msg_type;
q++;
*q = msg->sending_process_nr;
q++;
for (int i = 0; i < (int)time_v.size(); i++)
{
*q = msg->time_v[i];
q++;
}
for (int i = 0; i < (int)fail_v.size(); i++)
{
*q = msg->fail_v[i];
q++;
}
if (msg->msg_type == MSG)
{
char *p = (char *)q;
for (int i = 0; i < 50; i++)
{
*p = msg->contents.ptp_msg.msg_buf[i];
p++;
}
}
else
{
// TODO: write serialization for errmsg
}
}
void Pet_kea::deserialize(char *data, struct msg_t *msg)
{
int *q = (int *)data;
msg->msg_type = (msg_type)*q;
q++;
msg->sending_process_nr = *q;
q++;
for (int i = 0; i < (int)time_v.size(); i++)
{
msg->time_v[i] = *q; //////
q++;
}
for (int i = 0; i < (int)fail_v.size(); i++)
{
msg->fail_v[i] = *q;
q++;
}
if (msg->msg_type == MSG)
{
char *p = (char *)q;
for (int i = 0; i < 50; i++)
{
msg->contents.ptp_msg.msg_buf[i] = *p;
p++;
}
}
else
{
// TODO: write deserialization for errmsg
}
}
我将看一下提到的 flatbuffer 和 protobuffer 库。