OpenDDS - message_writer-> write(...)错误DDS :: RETCODE_TIMEOUT

时间:2015-09-01 13:24:07

标签: ace publisher subscriber data-distribution-service tao

我在openDDS中创建一个简单的消息程序。该程序使用发布者和订阅者。在发布者中,我写了一条消息:

DDS::ReturnCode_t error = message_writer->write(message, DDS::HANDLE_NIL);

当我尝试从180字节发送到3012字节时,编写器失败并显示:

  

错误10(== DDS :: RETCODE_TIMEOUT)

,大约260条消息后(我试图发送1500条消息)。我发现奇怪的是,当我发送的信息来自1&lt; = x&lt; <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);

任何帮助都非常感谢。谢谢!

1 个答案:

答案 0 :(得分:1)

我发现了问题。原因是因为我的应用程序发布速度快于网络分发样本的速度。解决方法是在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);

此数据编写器具有以下行为:

  

最多可以排队5个待处理的样本到一个或多个   订户。

     

如果5个样本待处理,则写入调用最多可阻止22个   秒等待队列中的开放。

     

如果未发生开启,则写入调用将返回   DDS :: RETCODE_TIMEOUT而不是RETCODE_OK。

感谢您的帮助!