c - 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);
你能告诉我我应该改变什么吗?
解决方案
将调用移动到printf()
循环内for (int k=0;k<=argc-2;k++){
。然后将显示所有消息。
推荐阅读
- mysql - 数据库中的整数溢出
- python - 使用minidom python解析xml元素属性
- qt - 增加 QTcpSocket 的接收缓冲区大小
- angular - 在表单字段-Angular-ReactiveForms 中至少更改一个值之前,使用验证更新表单不起作用
- jenkins - docker 中的 jenkins 个人资料在哪里?我找不到它(/etc/sysconfig/jenkins)
- android - 我如何解决错误:无法运行 mksdcard sdk 工具。在 Windows 7 64 位
- wpf - 如何在 prism 7 中的 shell 之前显示登录屏幕?因为 app.xaml 中有 PrismApplication 而 app.xaml.cs 中没有 OnStartup() 方法
- r - 将来自 lm 的系数制成表格
- assembly - TinyHelloWorld.c 中的“%%rax”
- salesforce - 当我部署 salesforce apex 类时,它显示错误