OpenDDS - message_writer->写入(...) 错误DDS::RETCODE_TIMEOUT
OpenDDS - message_writer->write(...) error DDS::RETCODE_TIMEOUT
我正在用 openDDS 创建一个简单的消息程序。该程序使用发布者和订阅者。在发布者中,我写了一条消息:
DDS::ReturnCode_t error = message_writer->write(message, DDS::HANDLE_NIL);
当我尝试将 180 字节发送到 3012 字节时,编写器失败并显示:
error 10 (== DDS::RETCODE_TIMEOUT)
,在大约 260 条消息后(我正在尝试发送 1500 条消息)。我觉得奇怪的是,当我发送来自 1 <= x < 180 和 3012 > x > 102400+ 字节的消息时,它会起作用。
我收到了作者端的错误。下面作者我做的:
if (error != DDS::RETCODE_OK) {
std::cerr << "writer failed because of error" << error << std::endl;
}
我的idl文件是这样的:
module Mess {
struct Mes {
string message;
};};
所以这使用了 TAO 字符串管理器。我将一个 char* 传递到消息中。
Messenger::Message message;
message.message = "some_Message";
然后像以前一样写消息
参加者:
DDS::DomainParticipant_var participant = dpf->create_participant(DOMAIN_ID, PARTICIPANT_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
主题:
DDS::Topic_var topic = participant->create_topic("TopicName", type_name, TOPIC_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
出版商:
DDS::Publisher_var publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
作者:
DDS::DataWriter_var writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
非常感谢任何帮助。谢谢!
我发现了问题。这是因为我的应用程序发布速度快于网络可以分发示例的速度。解决方法是在 DataWriter 上使用以下 Qos:
DDS::DataWriterQos dw_qos;
pub->get_default_datawriter_qos (dw_qos);
dw_qos.history.kind = DDS::KEEP_ALL_HISTORY_QOS;
dw_qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS;
dw_qos.reliability.max_blocking_time.sec = 22;
dw_qos.reliability.max_blocking_time.nanosec = 0;
dw_qos.resource_limits.max_samples_per_instance = 5;
DDS::DataWriter_var dw = pub->create_datawriter(topic, dw_qos, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
此数据写入器具有以下行为:
Can queue up to 5 samples that are pending delivery to one or more
Subscribers.
If 5 samples are pending, then a write call blocks for up to 22
seconds waiting for an opening in the queue.
If an opening does not occur then the write call will return
DDS::RETCODE_TIMEOUT instead of RETCODE_OK.
感谢大家的帮助!
我正在用 openDDS 创建一个简单的消息程序。该程序使用发布者和订阅者。在发布者中,我写了一条消息:
DDS::ReturnCode_t error = message_writer->write(message, DDS::HANDLE_NIL);
当我尝试将 180 字节发送到 3012 字节时,编写器失败并显示:
error 10 (== DDS::RETCODE_TIMEOUT)
,在大约 260 条消息后(我正在尝试发送 1500 条消息)。我觉得奇怪的是,当我发送来自 1 <= x < 180 和 3012 > x > 102400+ 字节的消息时,它会起作用。
我收到了作者端的错误。下面作者我做的:
if (error != DDS::RETCODE_OK) {
std::cerr << "writer failed because of error" << error << std::endl;
}
我的idl文件是这样的:
module Mess {
struct Mes {
string message;
};};
所以这使用了 TAO 字符串管理器。我将一个 char* 传递到消息中。
Messenger::Message message;
message.message = "some_Message";
然后像以前一样写消息
参加者:
DDS::DomainParticipant_var participant = dpf->create_participant(DOMAIN_ID, PARTICIPANT_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
主题:
DDS::Topic_var topic = participant->create_topic("TopicName", type_name, TOPIC_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
出版商:
DDS::Publisher_var publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
作者:
DDS::DataWriter_var writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
非常感谢任何帮助。谢谢!
我发现了问题。这是因为我的应用程序发布速度快于网络可以分发示例的速度。解决方法是在 DataWriter 上使用以下 Qos:
DDS::DataWriterQos dw_qos;
pub->get_default_datawriter_qos (dw_qos);
dw_qos.history.kind = DDS::KEEP_ALL_HISTORY_QOS;
dw_qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS;
dw_qos.reliability.max_blocking_time.sec = 22;
dw_qos.reliability.max_blocking_time.nanosec = 0;
dw_qos.resource_limits.max_samples_per_instance = 5;
DDS::DataWriter_var dw = pub->create_datawriter(topic, dw_qos, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK);
此数据写入器具有以下行为:
Can queue up to 5 samples that are pending delivery to one or more Subscribers.
If 5 samples are pending, then a write call blocks for up to 22 seconds waiting for an opening in the queue.
If an opening does not occur then the write call will return DDS::RETCODE_TIMEOUT instead of RETCODE_OK.
感谢大家的帮助!