IPC 队列:- 接收错误数据

Posted

技术标签:

【中文标题】IPC 队列:- 接收错误数据【英文标题】:IPC Queues:- Receiving wrong data 【发布时间】:2020-11-21 02:47:14 【问题描述】:

如果 flag 设置为 0,我的程序在 msgrcv 函数上接收错误数据,但是,如果我将特定数据的 flag 设置为 1,则 msgrcv 函数将继续等待。我在公共文件中定义了发送和接收函数,并从发送者和接收者文件中调用它。我检查了调试数据,它已正确发送,但在接收端,如果标志设置为 0 意味着接收到第一个数据包,那么我收到了错误的数据。如果将 flag 设置为 1,则表示特定消息类型数据 msgrcv 函数以等待状态结束。请帮忙。 /CommonMsgQueue.c/

    int InitializeMsgQueue(char *keypath)
    
       key_t key;
       int msgid;
       key = ftok(keypath,'B');
       if (key == -1 )
       
          perror("Failed to generate key ");
          exit(0);
       
       msgid = msgget(key, 0666 | IPC_CREAT );
       if ( msgid == -1 )
       
          perror("Failed to get msgid");
          exit(0);
       
       return msgid;
    
    int SendMsg(key_t msgqid ,StMesgQ *MsgData , int msglength)
    
        int iRetVal =0;
        iRetVal = msgsnd(msgqid,&MsgData,sizeof(StMesgQ),IPC_NOWAIT);
        if ( iRetVal == -1 )
        
           perror("Failed to send message");
        
        return iRetVal;
    
    int RcvMsg(key_t msgqid, StMesgQ *MsgData , int msglength)
    
       int iRetVal =0;
       iRetVal = msgrcv(msgqid,&MsgData,msglength,0,0);
       if (iRetVal == -1 )
       
          perror("Failed to receive message ");
          exit(0);
       
       
       return iRetVal;
    
    
   /*Sender.c*/
   msgqid = InitializeMsgQueue("/home/nprabhat/Nitesh/Nitesh_FrameWork/Key/ClientQueue");
   CommonSHMData = (struct CommonSHM*)ShmData;
   StMesgQ obj;
   while (1)
   
       
       printf("Sender:-- Enter the value For iIndex\n");
       scanf("%d",&value);
       CommonSHMData->iIndex = value;
       CommonSHMData->iIndex2 = value;
       DataPktToSend = (char*)CommonSHMData;
     memcpy(&obj.buf,&DataPktToSend,strlen(DataPktToSend));
       obj.iMsgType = 1;
       SendMsg(msgqid,&obj,sizeof(StMesgQ));
    
  /*Reciever.c*/
  RcvMsg(msgqid,&MsgData,sizeof(StMesgQ));
  CommonSHMData_Recv = (struct CommonSHM*)MsgData.buf;
  printf("Data Received from queue is %d",CommonSHMData_Recv->iIndex);

【问题讨论】:

您的代码似乎有误。 while 循环的右括号在哪里?代码中您的标志的名称是什么? 我没有发布我的完整代码。我在发布代码时错过了“while 循环”的右括号。 msgrcv 函数的第四个参数表示 flag 。我们可以根据需要设置为 0,-1 或 1。 请发minimal reproducible example,以便我们重现问题并帮助您调试。 给定int RcvMsg(key_t msgqid, StMesgQ *MsgData , int msglength),代码msgrcv(msgqid,&MsgData,msglength,0,0);将消息内容放在MsgData的位置指针 【参考方案1】:

关于:

   iRetVal = msgrcv( msgqid, &MsgData, msglength, 0, 0 );
   
   if (iRetVal == -1 )
   
      perror("Failed to receive message ");
      exit(0);
   
   
   memcpy(&MsgData,&RcvMsgData,sizeof(StMesgQ));

函数:memcpy()从右到左复制。

语法如下:

void *memcpy(void *destination, const void *source, size_t n);

因此,对memcpy() 的调用将通过对msgrcv() 的调用将放置在MsgData 中的数据与RcvMsgData 中恰好存在的任何垃圾覆盖在一起

【讨论】:

另外,MsgData 是一个指向StMesgQ指针,所以msgrcv() 调用会用消息内容覆盖指针本身——而且可能更多。 感谢您的回复。但是当我在 msgrcv 函数调用后检查调试时,我得到了错误的数据。我的意思是只在 memcpy 之前。

以上是关于IPC 队列:- 接收错误数据的主要内容,如果未能解决你的问题,请参考以下文章

System V IPC 之消息队列

C IPC - 无法从队列接收消息

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用

IPC - 消息队列(Message Queue)- 使用