Очередь Posix не получает все данные - PullRequest
0 голосов
/ 20 января 2020

У меня установлена ​​очередь posix между двумя потоками. Я отправляю 12 отдельных, идентичных, ~ 1k сообщений, но каждое из них выделено в отдельную область памяти. mq_receive () возвращает правильное количество полученных байтов (1030) для всех 12 сообщений, но первое 11 сообщение имеет только 835 байтов. Только последнее сообщение получено полностью.

TransferThread::InternalThreadEntry()
{
   while(1)
  {
        if (m_pQueuePtr->mq_receive(mQDesc, rxBuf, MAX_QUEUE_MSG_SIZE+1, &priority, error, 
         rxNumBytes) == false)
        {
            if (error != EAGAIN)
            {
                Util.GetDebugString(errStr, "MQ Receive failed", __FILE__, __LINE__);
                throw ACE_Exception(FRAMEWORK, errStr);
            }
        }
        if (rxNumBytes > 0)
        {
            std::memcpy(&tcp[tcp_index].rxMsg[0], rxBuf, rxNumBytes);
                DataTransferMsg_t* test = (DataTransferMsg_t*)(&(tcp[tcp_index].rxMsg[0]));
                std::cout << test->msg  << "\n \n" << std::endl;
        }

}

...TransferClient::sendMessage (UINT32 msg_length, UINT8 * msg, bool priority) 
{
     memset((void*) clientMsg, 0,MAX_QUEUE_MSG_SIZE);
     clientMsg->client_id = client_id;
     clientMsg->client_addr = clientMsg;
     clientMsg->name = name;
     clientMsg->msg_len = msg_length + sizeof(DataTransferMsg_t);
     clientMsg->destination = cpu;
     clientMsg->priority = priority;

     offset = sizeof(DataTransferMsg_t);

     clientMsg->msg = (UINT8*) (clientMsg + offset);

     std::memcpy((void *) (clientMsg->msg),(const void *) msg, msg_length);
     if(mq_send(qDesc, (const STRING *) clientMsg,
        (ACE_size_t)( clientMsg->msg_len), priority, err_num) == false)
     {
         throw ACE_Exception(FRAMEWORK, errStr);
     }
  }

... int main (int arg c, char * argv []) {

const STRING message5 [] = "Основные задачи в Проекте для службы передачи данных были надежность, безопасность, скорость и соблюдение ограничений на использование динамической памяти * 1015. * Позднее ограничение требовало \ создания пула памяти, из которого можно было бы выделить предварительно выделенную память для передачи блоков данных через \ методы сервиса до отправки OB. Поскольку размер этих сообщений не может быть известен заранее, \ необходим механизм предварительно выделенной памяти. С другой стороны, в полученном направлении \ размер данных равен известно, и использование пула памяти не требуется. Когда клиент инициирует передачу \ данные с помощью вызова sendData (), служба назначает память, необходимую для передачи пакета. Поскольку \ максимальный размер отдельного пакета разрешен для любого заданного сообщение составляет 1 Кб, служба должна сегментировать \ сообщения размером более 1 КБ, так как любое сообщение с высоким приоритетом должно быть не более 1k, все сообщения \, которые должны быть сегментированы, будут отправляться через TCP, а TCP гарантирует доставку в порядке отправки. Привет ";

...**for(int i = 0; i < 12; i++)
{**
... 
    if(!transferClient2->sendMessage(length5, (UINT8 *) message5, 0))
    {
        std::cout << "Test 4 Failed\n" << std::endl;
    }...
}

Вывод: в 11 из 12 случаев данные обрезаются точно так же, как показано ниже, если точно такое же место:

Основные цели в Проекте для данных Службой передачи были надежность, безопасность, скорость и соответствие ограничениям на использование динамической памяти * 1016. * Позднее ограничение требовало создания пула памяти, из которого можно было бы выделить заранее выделенную память для переноса блоков данных с помощью методов службы. до отправки OB. Поскольку размер этих сообщений не может быть известен заранее, требовался механизм предварительно выделенной памяти. С другой стороны, в полученном направлении известен размер данных и использование пула памяти не требуется. Когда клиент инициирует передачу данных с помощью вызова sendData (), служба назначает память, необходимую для передачи пакета. Так как maximg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...