2、 编写一段程序,使其用消息缓冲队列来实现client进程和server进程之间的通信。
时间: 2024-10-12 10:04:46 浏览: 26
在C++中,我们可以使用POSIX提供的`msgqueue`库来创建消息缓冲队列,实现客户端(client)和服务器端(server)之间的通信。下面是一个简单示例,展示了如何创建队列、发送和接收消息:
首先,安装必要的头文件:
```cpp
#include <sys/msg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
```
然后,定义一个结构体来存储消息内容:
```cpp
struct msgbuf {
char text[512]; // 消息内容
struct msghdr hdr;
};
```
接着,创建服务器端(server.cpp):
```cpp
#define MSGQ_SIZE 10
void server(char* queue_name) {
key_t key = ftok(queue_name, 's'); // 创建键
msg_queue_t mq_id; // 消息队列ID
if ((mq_id = msgget(key, IPC_CREAT | 0644)) == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
while (true) {
struct msgbuf msg;
memset(&msg, 0, sizeof(msg));
// 接收消息
ssize_t bytes_received = recvmsg(mq_id, &msg.hdr, 0);
if (bytes_received <= 0) {
perror("recvmsg");
break;
}
printf("Server received: %s\n", msg.text);
}
if (msgctl(mq_id, MSGRMID, NULL) != 0) {
perror("msgctl");
}
}
```
客户端(client.cpp):
```cpp
void client(char* queue_name) {
key_t key = ftok(queue_name, 'c');
msg_queue_t mq_id;
if ((mq_id = msgget(key, 0)) == -1 && errno == ENOENT) {
if (msgctl(key, IPC_SET, NULL, &msgflg) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
mq_id = msgget(key, IPC_CREAT | 0644);
}
if (mq_id == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
msgbuf msg;
strncpy(msg.text, "Hello from client", sizeof(msg.text)); // 定义消息
// 发送消息
if (sendmsg(mq_id, &msg.hdr, 0) != sizeof(msg)) {
perror("sendmsg");
exit(EXIT_FAILURE);
}
printf("Client sent: %s\n", msg.text);
msgctl(mq_id, MQUNLINK, NULL); // 删除消息队列
}
int main() {
char* queue_name = "./my_message_queue";
server(queue_name);
client(queue_name);
return 0;
}
```
运行这两个程序,服务器开始监听队列,客户端发送消息。每次通信完成后,服务器会删除队列。
阅读全文