2010-11-25 153 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中发送完整的数据,并且不希望在结构中有静态数组。有没有其他方式使用消息队列,我们​​可以实现这一点。

请提供您的意见。 谢谢

+1

记住:如果您缩进代码,将格式正确的! – 2010-11-25 09:07:06

回答

1

你可以通过mq_send()分配一个包含char缓冲区的包装。

您发送的每条消息都会被序列化到这个缓冲区,然后您将它传递给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

嗨 - 你不能只是将一个结构转换成char *来转换它 - 你必须编码转换,因为你也将int转换为char *。 – 2010-11-25 09:25:00

3

Receiver崩溃,因为它无法访问您的指针,该指针仅适用于发件人程序的使用。您需要将实际数据发送到消息队列而不是指针。

+0

你能告诉我们如何用结构实现这一点? – venkysmarty 2010-11-25 09:20:08