c++ - boost::进程间消息队列抛出错误

标签 c++ boost ipc message-queue boost-interprocess

我在 Windows 中使用 boost 进程间消息队列,但是我遇到了一个问题,当 max_msg_size 不等于 buffer_size 时它会抛出一个错误,我的部分代码如下:

//process A
message_queue::remove(name);
m_MQ = std::make_unique<message_queue>(create_only, name,2000,300);
m_MQ->try_send(buffer, buffer_size, 0);

//process B
m_MQ = std::make_unique<message_queue>(open_only, name);
m_MQ->try_receive(buffer, buffer_size, recvd_size, priority);

在这种情况下,如果 buffer_size 不等于 300,它将抛出 boost::interprocess_exception::library_error 并且我无法再传递可变长度缓冲区。 非常感谢。

最佳答案

当你声明...

if buffer_size doesn't equal to 300, it will throw boost::interprocess_exception::library_error

您的意思是“不等于”还是仅当缓冲区大小小于规定的最大消息大小时才会发生异常?

如果异常只发生在 buffer_size < 300那么我认为这是可以预料的——图书馆无法可靠地接收到一条可能高达 300 char 的消息。 s 进入一个小于 300 char 的缓冲区尺寸为 s。

相反,您应该使用 boost::interprocess::message_queue::get_max_msg_size 创建一个合适大小的接收缓冲区...

m_MQ = std::make_unique<message_queue>(open_only, name);
std::vector<char> buffer(m_MQ->get_max_msg_size());
m_MQ->try_receive(buffer.data(), buffer.size(), recvd_size, priority);

关于c++ - boost::进程间消息队列抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153353/

相关文章:

c# - C# 和 C 程序之间的命名管道通信失败

java - 如何最轻松地在同一主机上运行的 Cocoa(客户端)和 Java(服务器)之间进行 IPC/RPC?

c++ - boost 函数和 lambda 来包装一个函数

c++ - 在什么情况下我使用 malloc 和/或 new?

c++ - iterator_traits中的嵌套指针类型有什么用?

c++ - 如何检查 C++11 支持?

c++ - boost async_read 不使用 ssl 读取所有数据

c++ - 尝试使用 Boost.Filesystem 但它似乎没有链接?

java - Zuul不转发请求到其他微服务

c++ - C++链表声明中的语法错误