mq_receive

时间:2016-02-27 12:13:44

标签: c server posix ubuntu-14.04 mq

我不知道为什么我收到错误Message too long at mq_receive。我查看了与我的问题类似的所有帖子,我已经尝试了他们所说的内容,但我仍无法解决问题。有人能帮帮我吗?

#include <stdio.h>

int main(int argc, char **argv) {
    struct peticion pet;
    struct respuesta res;
    struct mq_attr attr1; 

    attr1.mq_msgsize = sizeof(pet);
    attr1.mq_maxmsg = 10;

    mqd_t cS = mq_open("/servidor", O_CREAT | O_RDONLY, 0700, attr1);
    if (cS == -1) {
        printf("ERROR: No se ha podido abrir la cola del servidor\n");
        exit(-1); 
    }

    while (1) {
        if (mq_receive(cS, (char*)&pet, sizeof(pet), 0) == -1) {
            printf("ERROR: El servidor no ha sido capaz de recibir peticiones\n");
            exit(-1);
        }
        switch (pet.cod) {
          case 0:
            init(pet.colaCliente);
            break;
          case 1:
            introducirPar(pet.key, pet.value, pet.colaCliente);
            break;
          case 2:
            obtenerValor(pet.key, pet.colaCliente);
            break;
          case 3:
            borrarPar(pet.key, pet.colaCliente);
            break;
        }
    }

    mq_close(cS);
    mq_unlink((const char*)&cS);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

问题是struct mq_attr应该作为指针传递给mq_open。由于某种原因,我不明白,compilar没有警告我。这解决了我的问题。因此解决方案是在mq_open中替换attr1并使用&attr1

答案 1 :(得分:0)

http://man7.org/linux/man-pages/man3/mq_receive.3.html

处引用手册页
  

EMSGSIZE                 msg_len小于消息的mq_msgsize属性                 队列中。

发布消息的过程传递的长度大于sizeof(pet)。结构定义(您未发布)不匹配,或者消息有效内容属于不同类型。