2015-09-01 78 views
0

我在openDDS中創建一個簡單的消息程序。該程序使用發佈者和訂閱者。在發佈我寫一條消息:OpenDDS - message_writer->寫(...)錯誤DDS :: RETCODE_TIMEOUT

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

當我嘗試從180個字節的發送到3012個字節作家失敗:

錯誤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); 

任何幫助十分讚賞。謝謝!

+0

您可以添加您的消息結構以及如何創建作者/發佈者/主題/參與者的完整代碼?你是否在編劇方或接收方收到錯誤? – Black0ut

+0

我收到編寫者方(發佈者)的錯誤,當我檢查是否(錯誤!= DDS :: RETCODE_OK)時收到錯誤。那麼錯誤是= 10。 – DKo

+0

您爲所有發送的消息只創建一次參與者/主題/發佈者/編寫者一次? 因此,我們知道錯誤!= DDS :: RETCODE_OK,您可以將錯誤變量與枚舉中的其他選項(DDS :: ReturnCode_t:http://community.rti.com/docs/html/api_dotnet/group__DDSReturnTypesModule .html),這樣你就可以得到更有意義的錯誤描述(例如DDS :: RETCODE_TIMEOUT,DDS :: RETCODE_ILLEGAL_OPERATION等),這可能會以正確的方式爲您提供解決方案 – Black0ut

回答

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。

感謝您的幫助!