[求助] MQ分包发送的解决办法

发布于 2022-09-09 23:54:27 字数 10602 浏览 16 评论 0

请各位帮忙分析解决下MQ分包发送的问题。

个人感觉可能有些选项设置有问题,报文通过MQ发送过去,对方收不到。

具体函数如下:

  1. #define MQ_MAXSIZE 1024
  2. int mq_sendfile(MQH mqh, const char *filename,char * msg_id, char * cor_id)
  3. {
  4.         
  5.     /* Declare MQI structures needed */
  6.     MQMD        md = {MQMD_DEFAULT};                /* Message Descriptor        */
  7.     MQPMO        pmo = {MQPMO_DEFAULT};                /* put message options        */
  8.     MQLONG        RetCode;                        /* completion code        */
  9.     MQLONG        Reason;                                /* reason code                */
  10.     MQLONG  msglen;
  11.     FILE    *hFile;
  12.     MQLONG  lSendLeng,lDatalen;
  13.     MQLONG  iCount;    /* File Segment count*/
  14.     char    msgbuf[MQ_MAXSIZE+1]; /* Temp Buffer*/
  15.         
  16.     if( mqh.obj_snd_flag == FALSE ) return(-1); /* object have not opend*/
  17.     md.Encoding       = MQENC_NATIVE;
  18.     md.CodedCharSetId = 819;
  19.    
  20.     memcpy( md.MsgId, MQMI_NONE, sizeof(md.MsgId) );
  21.     memcpy( md.CorrelId, MQCI_NONE, sizeof(md.CorrelId) );
  22.     memcpy( md.Format, MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH );
  23.     /* put MsgId and CorrelId for match condition */
  24.     if( msg_id[0] != 0x00 ) {
  25.               memset( md.MsgId, 0x00, sizeof(md.MsgId) );
  26.               strncpy( (char *)md.MsgId, msg_id, sizeof(md.MsgId) );
  27.     }
  28.     if( cor_id[0] != 0x00 ) {
  29.              memset( md.CorrelId, 0x00, sizeof(md.CorrelId) );
  30.              strncpy( (char *)md.CorrelId, cor_id, sizeof(md.CorrelId) );
  31.     }
  32.    
  33.    
  34.     iCount   = 0;
  35.     lSendLeng = 0;
  36.     hFile     = NULL;
  37.     lDatalen = 0;
  38.    
  39.     if( filename == NULL) {
  40.        swVdebug(0,"filename is null!");
  41.        return (0);
  42.     }
  43.       
  44.     if((hFile = fopen(filename,"rb"))==NULL){
  45.        swVdebug(0,"open filename :%s error !",filename);
  46.        return (-1);        
  47.     }
  48.      
  49.             
  50. /***
  51.     md.Version         = MQMD_VERSION_2;
  52.     md.MsgFlags         = MQMF_SEGMENT;
  53.     pmo.Version         = MQMD_VERSION_2;
  54.     pmo.Options |=  MQPMO_LOGICAL_ORDER;
  55. ***/
  56.    
  57.             
  58.     int iTotal=0, iNum=0;
  59.     while(1) {               
  60.          lSendLeng = fread(msgbuf,1,MQ_MAXSIZE,hFile);
  61.                
  62.          swVdebug(3,"read file :%s ,result:%ld !",filename, lSendLeng);
  63.          md.Version   = MQMD_VERSION_2;
  64.          md.MsgFlags  = MQMF_SEGMENT;
  65.          pmo.Version   = MQMD_VERSION_2;
  66. /*
  67.          pmo.Options  |= MQPMO_LOGICAL_ORDER|MQPMRF_GROUP_ID;
  68.          pmo.Options  = MQPMO_LOGICAL_ORDER ;
  69.          pmo.PutMsgRecFields  = MQPMRF_GROUP_ID;
  70.          pmo.Options  = MQPMO_LOGICAL_ORDER + MQPMO_SYNCPOINT ;
  71.          pmo.Options  = MQPMO_LOGICAL_ORDER|MQPMRF_GROUP_ID;
  72.          pmo.Options  = MQPMO_LOGICAL_ORDER ;
  73.          pmo.PutMsgRecFields  = MQPMRF_GROUP_ID;
  74. */
  75.          pmo.Options  = MQPMO_LOGICAL_ORDER ;
  76.          pmo.PutMsgRecFields  = MQPMRF_GROUP_ID;
  77.          pmo.PutMsgRecOffset = iTotal;
  78.          pmo.RecsPresent = iNum;
  79.          if (lSendLeng < 0) {
  80.           swVdebug(0,"read file  error!");
  81.           iCount = -1;
  82.           break;   
  83.          }  
  84.          if ( lSendLeng == 0)
  85.           break;
  86.          if(lSendLeng < MQ_MAXSIZE)
  87.            md.MsgFlags = MQMF_LAST_MSG_IN_GROUP;        
  88.          else      
  89.            md.MsgFlags = MQMF_MSG_IN_GROUP;   
  90.                      
  91.          msglen = lSendLeng;
  92.          MQPUT( mqh.hcon,                /* connection handle                */
  93.                       mqh.hobj_snd,        /* object handle                */
  94.                       &md,                        /* message descriptor                */
  95.                       &pmo,                /* default options (datagram)        */
  96.                       msglen,                /* message length                */
  97.                       msgbuf,                /* message buffer                */
  98.                       &RetCode,                /* completion code                */
  99.                       &Reason );                /* reason code                        */
  100.               
  101.                   /* report reason, if any */
  102.          swVdebug(3,"send mq  count:%ld ,total:%ld,result:%d RetCode:%d !",iCount,lDatalen,Reason,RetCode);
  103.          if(Reason != MQRC_NONE || RetCode == MQCC_FAILED || RetCode == MQCC_UNKNOWN) {
  104.                   mqh.reason = Reason;
  105.                   break;
  106.                       
  107.          }
  108.               
  109.                  
  110.          iCount++;
  111.          iNum ++;
  112.          lDatalen += lSendLeng;
  113.          iTotal += lSendLeng;
  114.          swVdebug(3,"send mq  OK ,count:%ld ,total:%ld,result:%d !",iCount,lDatalen,Reason);
  115.     }
  116.                
  117.         
  118.     fclose(hFile);      
  119.     return (lDatalen);
  120. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文