【问题标题】:IPC message queueIPC 消息队列
【发布时间】:2021-03-12 12:59:01
【问题描述】:

我正在 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);

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

【问题讨论】:

  • 您应该包含演示问题所需的完整(最小化)代码,以及输入的特定场景、所需的输出、当前错误输出以及对确切内容的描述出错了。我认为不值得读者花时间去推测删节的代码。

标签: c ipc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2013-01-05
    • 2010-12-06
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2011-11-04
    相关资源
    最近更新 更多