首页 > 解决方案 > IPC 消息队列

问题描述

我在 c 中创建两个应用程序(客户端和服务器)以通过 IPC 消息队列进行通信。服务器必须只使用一个队列为许多客户端操作。必须为服务器提供客户端的 ID 作为命令行参数,以及每个客户端的 ID。客户端由 mesg_type 识别。

我在接收来自所有客户端的消息时遇到问题 - 我可以从客户端 A 接收消息几次,然后从客户端 B 接收几次,从客户端 A 接收几次,依此类推。我认为问题出在代码的以下部分:

int status;
key_t key;
int msgid; 

for(int i=0;i<argc-1;i++){
    clients_ids[i]=atoi(argv[i+1]);
}

key = ftok(".", 50);
msgid = msgget(key, 0666 | IPC_CREAT);
  
if (msgid == -1) {
    fprintf(stderr, "msgget failed: %d\n", errno);
    exit(EXIT_FAILURE);
}
  
do{
 for (int k=0;k<=argc-2;k++){
    status = msgrcv(msgid, &message, sizeof(message), clients_ids[k], 0);
    if(status != -1){
    type = message.mesg_type;
    strcpy(mesg, message.mesg_text);
    }
}

 printf("Message received (from id: %d): %s ",type, mesg);

你能告诉我我应该改变什么吗?

标签: cipc

解决方案


将调用移动到printf()循环内for (int k=0;k<=argc-2;k++){。然后将显示所有消息。


推荐阅读