我正在openDDS中创建一个简单的消息程序。此程序使用发布者和订阅者。在publisher中,我写了一条消息:
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);
这个数据写入器有以下行为:
可以排队多达5个样品等待交付给一个或多个用户。
如果有5个样本挂起,那么写调用阻塞最多22个等待队列打开的秒数。
如果没有打开,则write调用将返回DDS::RETCODE_TIMEOUT而不是RETCODE_OK.
谢谢你的帮助!