c语言消息队列 群聊 私聊 代码
时间: 2023-09-02 11:14:18 浏览: 100
以下是使用C语言实现消息队列,支持群聊和私聊的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#define QUEUE_NAME "/chat_queue"
#define MAX_MSG_SIZE 1024
#define MAX_USERS 10
typedef struct {
char username[20];
char msg[MAX_MSG_SIZE];
} chat_msg;
mqd_t queue;
mqd_t private_queues[MAX_USERS];
void handle_msg(chat_msg msg) {
if (msg.msg[0] == '@') { // Private message
char username[20];
int i = 0;
while (msg.msg[i] != ' ') {
username[i] = msg.msg[i+1];
i++;
}
username[i] = '\0';
for (int j = 0; j < MAX_USERS; j++) {
if (private_queues[j] != -1 && strcmp(username, private_queues[j].mq_name) == 0) {
mq_send(private_queues[j], (char*)&msg, sizeof(chat_msg), 0);
break;
}
}
} else { // Group message
for (int i = 0; i < MAX_USERS; i++) {
if (private_queues[i] != -1) {
mq_send(private_queues[i], (char*)&msg, sizeof(chat_msg), 0);
}
}
}
}
void* receive_messages(void* arg) {
while (1) {
chat_msg msg;
mq_receive(queue, (char*)&msg, sizeof(chat_msg), NULL);
handle_msg(msg);
}
}
int main(int argc, char* argv[]) {
mq_attr attr = {
.mq_flags = 0,
.mq_maxmsg = 10,
.mq_msgsize = sizeof(chat_msg),
.mq_curmsgs = 0
};
queue = mq_open(QUEUE_NAME, O_CREAT | O_RDWR, 0666, &attr);
pthread_t thread;
pthread_create(&thread, NULL, receive_messages, NULL);
char username[20];
printf("Enter your username: ");
scanf("%s", username);
printf("Welcome to the chat!\n");
chat_msg msg;
while (1) {
printf("Enter your message: ");
scanf(" %[^\n]", msg.msg);
strcpy(msg.username, username);
mq_send(queue, (char*)&msg, sizeof(chat_msg), 0);
}
mq_close(queue);
mq_unlink(QUEUE_NAME);
return 0;
}
```
该代码创建一个名为`/chat_queue`的消息队列,用于接收所有聊天消息。当用户进入聊天室并输入用户名后,程序将在另一个线程中开始接收消息。当用户输入一条消息时,程序将其发送到消息队列中,并将其发送到所有已连接私有队列或公共队列中。私人消息以@username的格式指定接收者的用户名。
需要注意的是,由于使用了POSIX消息队列,因此需要使用`-lrt`选项来编译该程序。
阅读全文