我正在使用SysV发送/接收消息。
我的Server类的线程函数内部是我创建密钥和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
中在客户端类中,这就是我如何创建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。有这个原因吗?
答案 0 :(得分:0)
如果指定了文件名且文件应该存在但未存在,或者路径名中的某个目录不存在,则不会发生此类文件或目录错误。当key未引用任何对象并且未设置IPC_CREAT标志时,它会发生在msgget()中。
答案 1 :(得分:0)
发现错误。 而不是
sprintf(bufT.mtext, "%d\n", client[temp].mqID);
应该是
sprintf(bufT.mtext, "%d\n", keyT);
尝试使用MQID而不是密钥加入MQ。