#define MSGKEY 75 #define MAX_TYPE 10 // 最大消息类型 struct msgform { long mtype; char mtext[256]; } msg; int msgqid, i; void client() { int i; msgqid = msgget(MSGKEY, 0777); for (i = MAX_TYPE; i >= 1; i--) { msg.mtype = i; printf("input your string in smg:"); scanf("%s", msg.mtext); msgsnd(msgqid, &msg, 256, 0); printf("(client) send\n"); sleep(1); } exit(0); } void server() { msgqid = msgget(MSGKEY, 0777 | IPC_CREAT); int is_done = 0; int types[] = {5, 4, 3, 2, 1}; int ntypes = sizeof(types) / sizeof(int); for (int i = 0; i < ntypes && !is_done; i++) { msgrcv(msgqid, &msg, 256, types[i], 0); printf("(server) received string: %s\n", msg.mtext); printf("(server) received\n"); is_done = (msg.mtype == 1); } exit(0); } int main() { while ((i = fork()) == -1); if (i == 0) server(); while ((i = fork()) == -1); if (i == 0) client(); wait(0); wait(0); msgctl(msgget(MSGKEY, 0777), IPC_RMID, 0); return 0; }
时间: 2024-03-30 08:33:15 浏览: 41
C/C++中的typedef和#define详解
这是一个使用 System V 消息队列实现的简单的客户端-服务器交互程序。其中,客户端通过输入字符串,将不同类型的消息发送给服务器。服务器则按照特定顺序接收不同类型的消息,并输出消息内容。当服务器接收到类型为 1 的消息时,退出程序。
具体实现中,使用了 msgget() 函数创建或获取一个消息队列,msgsnd() 函数将消息发送到队列中,msgrcv() 函数从队列中接收消息。msgctl() 函数则用于删除消息队列。
需要注意的是,在发送和接收消息时,需要指定消息的类型。在本程序中,将消息类型定义为整型,从 MAX_TYPE 到 1 依次发送给服务器。在服务器中,按照特定顺序接收不同类型的消息。当接收到类型为 1 的消息时,退出程序。
另外,程序中使用了 fork() 函数创建子进程,并使用 wait() 函数等待子进程结束。这是因为客户端和服务器需要同时运行,且需要在消息队列被删除之前结束。
阅读全文