【问题标题】:OpenDDS - message_writer->write(...) error DDS::RETCODE_TIMEOUTOpenDDS - message_writer->write(...) 错误 DDS::RETCODE_TIMEOUT
【发布时间】:2015-09-01 13:24:06
【问题描述】:

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

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

当我尝试从 180 字节发送到 3012 字节时,写入器失败:

错误 10 (== DDS::RETCODE_TIMEOUT)

,大约 260 条消息后(我正在尝试发送 1500 条消息)。我觉得奇怪的是,当我发送来自 1 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);

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

【问题讨论】:

  • 您能否添加您的消息结构以及您如何创建作者/发布者/主题/参与者的完整代码?你是在作者端还是接收端收到错误?
  • 我在作者端 (Publisher) 收到错误,当我检查 if (error != DDS::RETCODE_OK) 时收到错误。那么错误是= 10。
  • 您只为您发送的所有消息创建参与者/主题/发布者/作者一次,对吗?因此,我们知道错误!= DDS::RETCODE_OK,您可以将错误变量与枚举中的其他选项(DDS::ReturnCode_t:community.rti.com/docs/html/api_dotnet/…)进行比较,这样您将能够获得更有意义的错误描述(像 DDS::RETCODE_TIMEOUT、DDS::RETCODE_ILLEGAL_OPERATION 等)可能会引导您找到正确的解决方案
  • 感谢您的回复。是的,我只创建一次参与者/主题/发布者/作者。然后等待订阅者,然后在 for 循环中编写和创建消息。我现在可以看到错误是 DDS::RETCODE_TIMEOUT。但是我仍然不知道为什么它只在字节从 180 到 3012 时才会失败。我觉得这很奇怪。

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


【解决方案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 个 等待队列中的开口的秒数。

如果没有打开,那么 write 调用将返回 DDS::RETCODE_TIMEOUT 而不是 RETCODE_OK。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多