0

我正在使用 SysV 发送/接收消息。

在我的服务器类的线程函数内部是我创建密钥和 MQ 的地方。这已成功完成,新 MQ 的 mqID 存储在 struct msgbuf 中名为 mtext 的 char[] 变量中

struct msgbuf {
    long mtype;
    char mtext[100];
};

这就是我在服务器类的线程函数中创建 mqID 的方式:

void *thread_function(void *arg){
    int temp; //temp placement for current client
    temp=i;
    key_t keyT;
    struct msgbuf bufT;
    keyT=ftok("mcs1.c", 'B'); //create key for client[temp]
    if ((client[temp].mqID=msgget(keyT, 0666 | IPC_CREAT))==-1){ //private mq for client[temp]
            perror("msgget");
    }
    bufT.mtype=2;   //1. SET MTYPE TO 2
    sprintf(bufT.mtext, "%d\n", client[temp].mqID);//2. SET MTEXT TO MQID OF PRIVATE MQ

    if (msgsnd(msqid, &bufT, sizeof(bufT.mtext),0)==-1) {perror("msgsnd");} //3. SEND TO CLIENT using global MQ

    ...
    }

我刚刚创建的新 MQ 的 MQID 存储在 bufT 中

在客户端类中,这就是我 rcv MQID 和创建 MQ 的方式:

...
if(msgrcv(msqid, &buf, sizeof(buf.mtext), 2, 0) == -1){ //RECEIVE ACK MSG
            perror("msgrcv");
    }
    else{
            printf("ack received\n");
    }
    key_t key1;
    key1=atoi(buf.mtext);
    if ((mqT=msgget(key1, 0666)) == -1){
            printf("UNABLE TO JOIN PRIVATE MQ");
                    perror("msgget");
                    printf("%d", key1);
    }
...

每当我运行服务器然后运行客户端时,它都会msgget: No such file or directory在运行客户端程序的终端上显示。即使当我在客户端类中打印密钥并且是正确的密钥时,它仍然无法加入 MQ。是否有一个原因?

4

2 回答 2

0

当指定文件名并且文件应该存在但不存在时,或者当路径名中的目录之一不存在时,不会发生此类文件或目录错误。当 key 不引用任何对象且 IPC_CREAT 标志未设置时,它与 msgget() 一起发生。

于 2013-04-06T20:37:23.387 回答
0

发现了错误。代替

sprintf(bufT.mtext, "%d\n", client[temp].mqID);

它应该是

sprintf(bufT.mtext, "%d\n", keyT);

正在尝试使用 MQID 而不是密钥加入 MQ。

于 2013-04-08T17:20:00.657 回答