2010-11-25 3 views
1

У меня есть требование об обмене данными между двумя процессами с использованием очередей сообщений. Один процесс отправляет запрос другому процессу, а другой процесс отправляет ответ.Передача сообщений между процессами с использованием очередей сообщений

Например, один из запросов представляет список всех имен файлов, открытых процессом. Я сделал структуру интерфейса, как

#define LIST_NAMES 1 
#define LIST_FILE_NAMES_RESP 2 

struct sFileStruct { 
    unsigned int uiCommand; 
    unsigned long ulNoOfBytes; // Number of bytes to be parsed in cha* pointer below 
    char*   pRecvData; // file names packed here in response. 
}; 


sFileStruct inData; 
// I am filling the data. 
int inSize = sizeof(inData); 

mq_send(m_qSendDesc, (char*)&inData, inSize, inPriority); 

Я думаю, проблема с выше конструкции является то, что имена файлов legth меняется символ * указатель, указывающий на данные разные, но размер структуры всегда постоянна, поэтому приемник не receving все данные и приемник сбой при доступе к указателю char *.

Я хочу отправить полные данные в один mq_send и не хочу иметь статический массив внутри структуры. Есть ли другой способ использования очередей сообщений, которые мы можем достичь.

Просьба указать ваши данные. Thanks

+1

Помните: Если вы отступы ваш код, он будет отформатирован должным образом! – 2010-11-25 09:07:06

ответ

1

Вы можете сделать обертку над mq_send() с выделенным буфером символов.

Каждое отправленное вами сообщение будет сериализовано в этот буфер, а затем вы передадите его mq_send с соответствующей длиной - sizeof (int) + sizeof (long) + strlen (pRecvData).

Получатель прочитает эти данные и десериализует их в sFileStruct.

ИМХО использование std :: string вместо char * было бы лучше.

Пример кода (не проверено):

class MQWrapper 
{ 
    std::string m_strBuffer; 
public: 
    int Send(const sFileStruct& sfs) 
    { 
     m_strBuffer.clear(); 
     m_strBuffer.append(static_cast<const char*> & sfs.uiCommand, sizeof(sfs.uiCommand)); 
     m_strBuffer.append(static_cast<const char*> & sfs.ulNoOfBytes, sizeof(sfs.ulNoOfBytes)); 
     m_strBuffer.append(sfs.pRecvData); // only if it's zero-terminated string!!! 

     return mq_send(m_qSendDesc, m_strBuffer.c_str(), m_strBuffer.length(), inPriority); 
    } 


    char m_receiveBUffer[ BUFFER_SIZE ]; 

    int Receive(sFileStruct& sfs) 
    { 
     int res = mq_receive(m_qSendDesc, receiveBUffer, BUFFER, outPriority); 
     if(res < 0) 
      return res; 
     if(res < sizeof(int) + sizeof(long)) 
      return -1000; // malformed message 
     sfs.uiCommand = * (static_cast<unsigned int*> (m_receiveBUffer[0])); 
     sfs.ulNoOfBytes = * (static_cast<long*> (m_receiveBUffer[ sizeof(int) ])); 

     // I don't really use this style in my work and not sure how to use it 
     // str::string would be much easier 
     int stringLen = res - sizeof(int) - sizeof(long); 
     sfs.pRecvData = new char [ stringLen + 1 ]; // you have to delete [] it later 
     if(stringLen > 0) 
      strcpy(sfs.pRecvData, receiveBUffer + sizeof(int) + sizeof(long), stringLen); 
     ss.pRecvData[ stringLen ] = '\0'; // null terminator 
     return 0; 
    } 
}; 
0

Не должен ли второй параметр mq_send быть значением const char *? Но вы передаете написанную на заказ структуру. Я бы написал код для сериализации или превратил структуру, если бы вы были вами, в const char *, затем используйте strlen для получения своей длины и передайте эти два значения в качестве второго и третьего аргументов mq_send.

+0

Извините, это было упомянуто в неправильном вопросе, теперь оно было изменено mq_send (m_qSendDesc, (char *) & inData, inSize, inPriority); – venkysmarty 2010-11-25 09:19:11

+0

hi - вы не можете просто передать структуру char * для ее преобразования - вам нужно закодировать преобразование, так как вы также превращаете ints в char *. – 2010-11-25 09:25:00

3

Приемник сбой, поскольку он не может получить доступ к вашему указателю, который доступен только для использования с помощью программы-отправителя. Вам необходимо отправить фактические данные в очередь сообщений, а не указатель.

+0

не могли бы вы рассказать, как мы можем достичь этого со структурами? – venkysmarty 2010-11-25 09:20:08

Смежные вопросы