У меня установлена очередь 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