2015-09-01 15 views
0

Я создаю простую программу сообщений в openDDS. В этой программе используется издатель и подписчик. В издателю я пишу сообщение с:OpenDDS - message_writer-> write (...) error DDS :: RETCODE_TIMEOUT

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

Когда я пытаюсь послать от 180 байт до 3012 байт, автор терпит неудачу с:

ошибки 10 (== ДДС :: 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; 
    };}; 

Так что это использует ТАО строки менеджер. Я передаю 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

Я получаю ошибку на стороне автора (Publisher), ошибка получена, когда я проверяю, является ли (ошибка! = 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

Я выяснил, проблема. Причина этого заключалась в том, что мое приложение издавалось быстрее, чем сеть могла распространять образцы. Исправление заключается в использовании следующих QOS на DataWriter:

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.

Спасибо за помощь!